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

时间:2008-09-16 17:13:40

标签: java operating-system cpu ram

我需要检查java中服务器的CPU和内存使用情况,有谁知道怎么做?

15 个答案:

答案 0 :(得分:69)

如果您在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/>");

然而,这些只应该估计......

答案 1 :(得分:19)

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

答案 2 :(得分:17)

如果您正在使用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

答案 3 :(得分:15)

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

答案 4 :(得分:9)

JMX,提供的MXBeans(ThreadMXBean等)将为您提供内存和CPU使用。

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

答案 5 :(得分:8)

对于内存使用,以下内容将起作用,

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

对于CPU使用情况,您需要使用外部应用程序来测量它。

答案 6 :(得分:5)

从Java 1.5开始,JDK附带了一个新工具:JConsole可以显示任何1.5或更高版本JVM的CPU和内存使用情况。它可以做这些参数的图表,导出到CSV,显示加载的类数,实例数,死锁,线程等......

答案 7 :(得分:4)

如果您使用已在许多答案中发布的runtime / totalMemory解决方案(我已经做了很多),如果您想要相当准确/一致的结果,请务必先强制使用两个垃圾收集。

为了提高效率,Java通常允许垃圾在强制GC之前填满所有内存,即使这样它通常也不是一个完整的GC,所以你的runtime.freeMemory()的结果总是介于“真正的”免费量之间记忆和0。

第一个GC没有得到所有东西,它得到了大部分。

上升的是,如果你只是进行freeMemory()调用,你会得到一个绝对无用而且变化很大的数字,但是如果先做2 gc那么它是一个非常可靠的指标。它还使例程MUCH更慢(可能是秒)。

答案 8 :(得分:3)

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

答案 9 :(得分:2)

以下是一些计算当前内存使用量的简单代码,以兆字节为单位:

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

答案 10 :(得分:2)

我还会添加以下方法来跟踪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

答案 11 :(得分:1)

如果您使用的是Tomcat,请查看Psi Probe,它可以监控内部和外部内存消耗以及许多其他区域。

答案 12 :(得分:1)

JConsole是监视正在运行的Java应用程序的简单方法,您也可以使用Profiler获取有关应用程序的更详细信息。我喜欢使用NetBeans Profiler

答案 13 :(得分:1)

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

答案 14 :(得分:0)

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