如何检查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和性能工具平台)来分析内存使用情况等