Java VisualVM CPU使用率和处理器关联

时间:2016-03-04 17:14:00

标签: java jvisualvm

根据我今天的经验,我发现Oracle的Java VisualVM显示cpu使用率占总机器核心的百分比,即使受监控的JVM在操作系统中设置的进程关联性有限也是如此。这是在“监视器”选项卡中。

使用taskset(在linux,Ubuntu上)限制受监视的jvm,当处理器允许jvm在htop中接近100%利用率时,VisualVM中显示的cpu百分比显然等于cpus的总数除以允许监视的jvm的处理器数。因此,对于这种情况,比例的分辨率是不够的。

您能否确认您在其他操作系统上或一般情况下都发现了相同的情况?

在显示cpu使用情况时,有没有办法让VisualVM帐户只用于关联性分配的核心?

1 个答案:

答案 0 :(得分:5)

根据VisualVM source code,CPU使用率确实计算为总CPU时间除以处理器数量:

    long processCpuTime = tracksProcessCpuTime ?
        model.getProcessCpuTime() / processorsCount : -1;

其中 processorsCount 是从 OperatingSystemMXBean 获得的:

    OperatingSystemMXBean osbean = mxbeans.getOperatingSystemMXBean();
    if (osbean != null) processorsCount = osbean.getAvailableProcessors();

有一个长期存在的JVM错误JDK-6515172,没有考虑进程关联性,即 getAvailableProcessors 总是返回CPU的总数,而不管任务集如何。这是针对Linux和BSD的;在Solaris和Windows上正常工作。

大约一个月前,这个bug终于解决了。但是,修复程序仅适用于JDK 9。

查看this question可能的解决方法。虽然它们有些难看。

相关问题