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

Determining minimum memory requirement and CPU usage

我一直在从事一个 Java 软件项目,该项目将部署到各种硬件设备(例如,raspberry pi、android phone)。

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

我如何测量它们? Java 可以使用哪些工具?

我的一些免费使用的基准测试是用 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.

的相同困难

您可以获得分配给 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;

提前估计内存使用量相当困难,因此我建议进行一些监控(在实际负载下)以获得大概数字。

关于内存 - 典型的堆使用图类似于 this question and looks like similar to a saw. Under normal circumstances the top point of the saw is where the GC happens. You could lower this limit and invoke GC more frequently, resulting longer delays/worse performance - so it's up to you if these delays are acceptable. From the image on linked question I'd say the minimal heap size should be 300M plus stack which is most often insignificant 中列出的图,并且波动不大,除非您进行大量的字符串搅动等

关于 CPU - 同样,这应该首先来自 认为可接受的实时和一些 post- 处理是两个相反的极端情况。 Java 并没有为此添加任何细节。例如,Oracle 在姊妹 SO 站点上有一个 short estimation guide for Weblogic server, but this might be irrelevant to your case. There's also a similar discussion。最好的办法是做一些测试并确定事情变得不可接受的程度。

您可以使用 分析工具,如 JProfiler、JProbe 等来分析 CPU 和负载下应用程序的内存使用情况。

当你有 CPU 的结果和长时间 运行 测试的内存使用情况时,比如几天的测试,你可以确定你的 java申请。

下面的代码怎么样(另见答案 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();
  }
}

你可以借助 jvisualvm 这个工具的路径是 Program Files\Java\jdk1.6.0_38\bin\jvisualvm.exe

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

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

下面列出了一些可用于监视和分析 Java 应用程序的选项。

  1. Jconsole
  2. JVisualVM
  3. NewRelic 插件
  4. Yourkit 分析器

但是对于负载测试,您可以使用像 Jmeter 这样的应用程序来测试用例上的应用程序,也可以进行压力测试以确定应用程序构建的基准。

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