繁体   English   中英

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

[英]Determining minimum memory requirement and CPU usage

我一直在研究一个Java软件项目,它将被部署到各种硬件设备(例如,raspberry pi,android phone)。

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

我该怎么测量它们? 什么是Java可用的工具?

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

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

在此输入图像描述

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

您可以使用以下命令获取分配给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;

我的一些免费使用基准测试是用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相同的困难。

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

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

关于CPU - 再次,这应该首先从认为可接受的,实时和一些后处理是两个相反的角落情况。 Java并没有真正添加任何细节。 例如,Oracle有一个简短的Weblogic服务器估算指南 ,但这可能与您的情况无关。 在姐妹SO网站上也有类似的讨论 最好是进行一些测试并确定事情变得不可接受的程度。

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

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

下面的代码怎么样(另见这里的答案)

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();
  }
}

有一些选项可用于监视和分析Java应用程序,如下所示。

  1. JConsole的
  2. JVisualVM
  3. NewRelic插件
  4. Yourkit Profiler

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM