确定最低内存要求和CPU使用率

时间:2015-05-21 06:22:30

标签: java memory profiling cpu-usage

我一直致力于一个Java软件项目,该项目将部署到各种硬件设备(例如,raspberry pi,android手机)。

在将此项目作为产品发布之前,我想通过明确说明用户运行我们的软件产品所必需的最低要求(内存和CPU)或硬件设备来引导用户。

我该如何衡量它们?什么是可用于Java的工具?

7 个答案:

答案 0 :(得分:11)

您可以获得 jvisualvm 的帮助 该工具的路径是 Program Files \ Java \ jdk1.6.0_38 \ bin \ jvisualvm.exe

您可以使用它来确定您的CPU利用率和内存消耗。

enter image description here

您可以看到CPU利用率和内存利用率。希望这个工具可以帮到你。

答案 1 :(得分:10)

您可以使用以下命令获取分配给JVM的总内存:

Runtime.getRuntime().totalMemory();

和可用内存(分配给JVM的未使用内存):

Runtime.getRuntime().freeMemory();

因此,要使用内存,可以减去可用内存 从总记忆中。

所以,你可以这样做:

long Total_Memory =Runtime.getRuntime().totalMemory(); long Free_Memory=Runtime.getRuntime().freeMemory(); long Memory =Total_Memory-Free_Memory;

答案 2 :(得分:5)

我的一些免费使用基准测试是用Java编写的,其中包含在Raspberry Pi和Android上运行的变体。阅读我的网站上的更多内容,了解两者的结果,以及基准和源代码下载链接(免费):

http://www.roylongbottom.org.uk/Raspberry%20Pi%20Benchmarks.htm#anchor13 http://www.roylongbottom.org.uk/android%20benchmarks.htm

或许比CPU速度和内存大小更重要的是Android和Java版本。在我的情况下,旧版本的JRE不会运行后来的JDK生成的代码,而且我已经阅读了与Android相同的困难。

答案 3 :(得分:4)

预先估计内存使用量相当困难,因此我建议进行一些监控(在实际负载下)来获得球场数据。

关于内存 - 典型的堆使用图与this question中列出的类似,看起来类似于锯。 在正常情况下,锯的顶点是GC发生的地方。您可以降低此限制并更频繁地调用GC,从而导致更长的延迟/更差的性能 - 因此,如果这些延迟是可接受的,则取决于您。从链接问题上的图像我会说最小堆大小应该是300M加堆栈most often insignificant并且不会波动那么多,除非你做了大量的字符串搅动等等。

关于CPU - 再次,这应该首先从找到可接受的,实时和一些后处理是两个相反的极端情况。 Java并没有真正添加任何细节。例如,Oracle有short estimation guide for Weblogic server,但这可能与您的情况无关。姐妹SO网站上还有一个similar discussion。最好是进行一些测试并确定事情变得不可接受的程度。

答案 4 :(得分:4)

您可以使用分析工具(如JProfiler,JProbe等)来分析加载时应用程序的CPU和内存使用情况。

当您获得长时间运行测试的CPU和内存使用结果时,比如几天的测试,您可以确定您的Java应用程序的最低和最高要求。

答案 5 :(得分:3)

以下代码如何(另请参阅答案here

package client;

import java.io.File;

import java.text.NumberFormat;

public class SystemInfoUtil
{


  private Runtime runtime = Runtime.getRuntime();

  public String findInfo()
  {
    StringBuilder sb = new StringBuilder();
    sb.append(this.getOsInfo());
    sb.append(this.getMemInfo());
    sb.append(this.getDiskInfo());
    return sb.toString();
  }

  public String getOSname()
  {
    return System.getProperty("os.name");
  }

  public String getOSversion()
  {
    return System.getProperty("os.version");
  }

  public String getOsArch()
  {
    return System.getProperty("os.arch");
  }

  public long getTotalMem()
  {
    return Runtime.getRuntime().totalMemory();
  }

  public long getUsedMem()
  {
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
  }

  public String getMemInfo()
  {
    NumberFormat format = NumberFormat.getInstance();
    StringBuilder sb = new StringBuilder();
    long maxMemory = runtime.maxMemory();
    long allocatedMemory = runtime.totalMemory();
    long freeMemory = runtime.freeMemory();
    sb.append("Free memory: ");
    sb.append(format.format(freeMemory / 1024));
    sb.append("<br/>");
    sb.append("Allocated memory: ");
    sb.append(format.format(allocatedMemory / 1024));
    sb.append("<br/>");
    sb.append("Max memory: ");
    sb.append(format.format(maxMemory / 1024));
    sb.append("<br/>");
    sb.append("Total free memory: ");
    sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
    sb.append("<br/>");
    return sb.toString();

  }

  public String getOsInfo()
  {
    StringBuilder sb = new StringBuilder();
    sb.append("OS: ");
    sb.append(this.getOSname());
    sb.append("<br/>");
    sb.append("Version: ");
    sb.append(this.getOSversion());
    sb.append("<br/>");
    sb.append(": ");
    sb.append(this.getOsArch());
    sb.append("<br/>");
    sb.append("Available processors (cores): ");
    sb.append(runtime.availableProcessors());
    sb.append("<br/>");
    return sb.toString();
  }

  public String getDiskInfo()
  {
    /* Get a list of all filesystem roots on this system */
    File[] roots = File.listRoots();
    StringBuilder sb = new StringBuilder();

    /* For each filesystem root, print some info */
    for (File root: roots)
    {
      sb.append("File system root: ");
      sb.append(root.getAbsolutePath());
      sb.append("<br/>");
      sb.append("Total space (bytes): ");
      sb.append(root.getTotalSpace());
      sb.append("<br/>");
      sb.append("Free space (bytes): ");
      sb.append(root.getFreeSpace());
      sb.append("<br/>");
      sb.append("Usable space (bytes): ");
      sb.append(root.getUsableSpace());
      sb.append("<br/>");
    }
    return sb.toString();
  }
}

答案 6 :(得分:0)

有一些选项可用于监控&amp;分析下面列出的Java应用程序。

  1. JConsole的
  2. JVisualVM
  3. NewRelic插件
  4. Yourkit Profiler
  5. 然而,对于负载测试,您可以使用像Jmeter这样的应用程序来测试用例上的应用程序,也可以进行压力测试以确定应用程序构建的基准。

    不要错过分析您的前端和后端服务器以进行端到端分析。