如何检查Java中的CPU和内存使用情况?
我需要检查在java服务器的CPU和内存使用情况,任何人都知道如何做到这一点?
如果您在JVM内存中专门寻找:
Runtime runtime = Runtime.getRuntime(); NumberFormat format = NumberFormat.getInstance(); StringBuilder sb = new StringBuilder(); long maxMemory = runtime.maxMemory(); long allocatedMemory = runtime.totalMemory(); long freeMemory = runtime.freeMemory(); sb.append("free memory: " + format.format(freeMemory / 1024) + "<br/>"); sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "<br/>"); sb.append("max memory: " + format.format(maxMemory / 1024) + "<br/>"); sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "<br/>");
但是,这些应该只是一个估计…
package mkd.Utils; import java.io.File; import java.text.NumberFormat; public class systemInfo { private Runtime runtime = Runtime.getRuntime(); public String Info() { StringBuilder sb = new StringBuilder(); sb.append(this.OsInfo()); sb.append(this.MemInfo()); sb.append(this.DiskInfo()); return sb.toString(); } public String OSname() { return System.getProperty("os.name"); } public String OSversion() { return System.getProperty("os.version"); } public String OsArch() { return System.getProperty("os.arch"); } public long totalMem() { return Runtime.getRuntime().totalMemory(); } public long usedMem() { return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); } public String MemInfo() { 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 OsInfo() { StringBuilder sb = new StringBuilder(); sb.append("OS: "); sb.append(this.OSname()); sb.append("<br/>"); sb.append("Version: "); sb.append(this.OSversion()); sb.append("<br/>"); sb.append(": "); sb.append(this.OsArch()); sb.append("<br/>"); sb.append("Available processors (cores): "); sb.append(runtime.availableProcessors()); sb.append("<br/>"); return sb.toString(); } public String DiskInfo() { /* 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(); } }
如果您使用的是Sun JVM,并且对应用程序的内部内存使用感兴趣(您的应用程序使用了多less分配的内存),则更喜欢打开JVM的内置垃圾回收日志logging。 您只需将-verbose:gc添加到启动命令即可。
从Sun文档:
命令行参数-verbose:gc在每个集合上打印信息。 请注意,-verbose:gc输出的格式可能会在J2SE平台的发行版之间更改。 例如,以下是来自大型服务器应用程序的输出:
[GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.8479984 secs]
这里我们看到两个小的collections和一个主要的collections。 箭头前后的数字
325407K->83000K (in the first line)
分别指示垃圾收集前后的活动对象的组合大小。 在次要收集之后,计数包括不一定存活但是不能被收回的对象,要么是因为它们直接活着,要么是因为它们在老生代中或被引用。 括号中的数字
(776768K) (in the first line)
是总的可用空间,不包括在永久代中的空间,这是总堆减去一个幸存空间。 小的收集花了大约四分之一秒。
0.2300771 secs (in the first line)
欲了解更多信息,请参阅: http : //java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
从这里
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); int availableProcessors = operatingSystemMXBean.getAvailableProcessors(); long prevUpTime = runtimeMXBean.getUptime(); long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime(); double cpuUsage; try { Thread.sleep(500); } catch (Exception ignored) { } operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); long upTime = runtimeMXBean.getUptime(); long processCpuTime = operatingSystemMXBean.getProcessCpuTime(); long elapsedCpu = processCpuTime - prevProcessCpuTime; long elapsedTime = upTime - prevUpTime; cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors)); System.out.println("Java CPU: " + cpuUsage);
JMX,MXBeans(ThreadMXBean等)提供给你内存和CPU的使用。
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); operatingSystemMXBean.getSystemCpuLoad();
对于内存使用情况,以下内容将起作用,
long total = Runtime.getRuntime().totalMemory(); long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
对于CPU使用率,您需要使用外部应用程序来测量它。
从Java 1.5开始,JDK提供了一个新工具: JConsole可以显示任何1.5或更高版本的JVM的CPU和内存使用情况。 它可以做这些参数的图表,导出到CSV,显示加载的类的数量,实例的数量,死锁,线程等…
如果你使用已经在许多回答中发布的runtime / totalMemory解决scheme(我已经做了很多),如果你想要相当准确/一致的结果,一定要先强制两个垃圾回收。
为了提高效率,Java通常允许垃圾在强制GC之前填充所有的内存,即使这样通常也不是一个完整的GC,所以runtime.freeMemory()的结果总是在“真实”的可用内存量和0 。
第一个GC没有得到一切,它得到了大部分。
上升是,如果你只是做freeMemory()调用,你会得到一个绝对无用的数字,并且变化很大,但是如果做2 gc的话,这是一个非常可靠的量表。 这也会使例程变慢(可能是秒)。
下面是一些简单的代码来计算当前的内存使用量(兆字节):
double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
Java的运行时对象可以报告JVM的内存使用情况。 对于CPU消耗,您将不得不使用外部实用程序,如Unix的顶级或Windows进程pipe理器。
我还将添加以下方式来跟踪CPU负载:
import java.lang.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; double getCpuLoad() { OperatingSystemMXBean osBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory. getPlatformMXBeans(OperatingSystemMXBean.class); return osBean.getProcessCpuLoad(); }
你可以在这里阅读更多
JConsole是监控正在运行的Java应用程序的简单方法,或者您可以使用Profiler来获取有关应用程序的更多详细信息。 我喜欢使用NetBeans Profiler 。
YourKit Java分析器是一个出色的商业解决scheme。 您可以在有关CPU分析和内存分析的文档中find更多信息。
如果您正在使用Tomcat,请查看Psi Probe ,它可以监视内部和外部内存消耗情况以及其他许多区域。
对于Eclipse,您可以使用TPTP(testing和性能工具平台)来分析内存使用情况等