[英]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应用程序,如下所示。
但是,对于负载测试,您可以使用Jmeter等应用程序来测试用例上的应用程序,也可以进行压力测试以确定应用程序构建的基准。
不要错过分析您的前端和后端服务器以进行端到端分析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.