如何在Java中检查CPU和内存使用情况?

问题描述:

我需要在java中检查服务器的CPU和内存使用情况,任何人都知道它可以做什么?如何在Java中检查CPU和内存使用情况?

+1

[使用Java来获得操作系统级的可能重复系统信息](http://stackoverflow.com/questions/25552/using-java-to-get-os-level-system-information) – 2012-04-25 19:41:36

+0

也许这些链接将有所帮助:http://www.javaworld.com/和javaworld/javaqa/2002-11/01-QA-1108-CPU .html http://www.roseindia.net/javatutorials/determining_memory_usage_in_java.shtml – chessguy 2008-09-16 17:19:18

如果您使用的是Tomcat,请Psi Probe,它可以让你监控内部和外部存储器的消耗,以及其他领域的主机。

Java的Runtime对象可以报告JVM的内存使用情况。对于CPU消耗,您必须使用外部实用程序,如Unix的顶层或Windows进程管理器。

对于内存的使用,下面的工作,

long total = Runtime.getRuntime().totalMemory(); 
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 

CPU使用率,你需要使用一个外部应用程序来衡量它。

JConsole是监视正在运行的Java应用程序,一个简单的方法,也可以使用Profiler来得到你的应用程序的更多详细信息。我喜欢用这个NetBeans Profiler

如果您使用的是已被张贴在许多答案,这里的运行时间/ totalMemory解决方案(我已经做了很多),请务必先强行使两个垃圾收集,如果你想相当准确的/一致的结果。

对于效率刍议Java的通常允许强制GC之前的垃圾填满了所有的记忆,即使如此,它通常不是一个完整的GC,所以你的结果runtime.freeMemory()始终是“真正”的量之间的某处可用内存和0

第一GC没有得到一切,它得到大部分。

上升是,如果你只是做freeMemory()调用,你会得到一个绝对无用的数字,并且变化很大,但如果做2 gc的话,它是一个非常可靠的量表。它也会使例行程序更慢(可能是秒)。

如果你专门为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/>"); 

然而,这些应采取只有一个估计...

+0

所以如果我在Eclipse中运行,这将取决于我的Eclipse设置? – Coffee 2013-03-01 02:08:38

由于Java 1.5的JDK配备了一个新的工具:JConsole至极可以显示任何1.5或更高版本JVM的CPU和内存使用情况。它可以执行这些参数的图表,导出为CSV,显示加载的类的数量,实例的数量,死锁,线程等等...

YourKit Java Profiler是一个出色的商业解决方案。您可以在CPU profilingmemory profiling的文档中找到更多信息。

JMX,提供的MXBean(ThreadMXBean的,等等)会给你内存与CPU占用率。

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
operatingSystemMXBean.getSystemCpuLoad(); 

如果您使用的是Sun JVM,并有兴趣在应用程序(多少您的应用的使用分配的内存),我喜欢打开的JVM内置垃圾的内存使用情况收集日志。您只需将-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] 

这里我们可以看到两个小集合和一个主要的一个。数字 前后箭头

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

下面是一些简单的代码来计算兆内存的使用:

double currentMemory = ((double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024)); 

对于Eclipse,你可以使用TPTP(测试和性能工具平台),用于分析内存使用情况等more information

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

here

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

我还要补充以下的方法来跟踪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(); 
} 

你可以阅读更多here