【问题标题】:Difference between the eden space usage values reported by jcmd and java.lang.management.MemoryUsagejcmd 和 java.lang.management.MemoryUsage 报告的伊甸园空间使用值之间的差异
【发布时间】:2019-05-13 19:24:10
【问题描述】:

我想使用 java.lang.management.MemoryUsage 监控我的代码的堆使用情况。在下面的示例中,我在 HashSet 中创建了一堆条目,然后检查堆使用情况。我期待看到伊甸园空间已用内存的非零值。令我惊讶的是,我看到伊甸园空间使用率为零,幸存者空间使用率非零。 这与 jcmd 命令打印的堆信息值不匹配,它显示了伊甸园空间的非零使用情况。 有人可以帮我理解这背后的原因吗?

我在 Linux 上使用 ParllelOldGC (-XX:+UseParallelOldGC)、OpenJDK 11.0.2。

我尝试在各种论坛上搜索此内容,但找不到相关信息。

public HeapUsage() {
    System.out.println("Before ");
    printHeapUsage();
    HashSet<String> set = new HashSet<>();
    for (int i = 0; i<10000000; i++) {
        set.add(String.valueOf(i));
    }
    System.out.println("After");
    printHeapUsage();

}
public static void main(String[] args) throws InterruptedException {
    new HeapUsage();
    Thread.sleep(1000000);
}

private void printHeapUsage() {
    for (MemoryPoolMXBean mpbean :
         ManagementFactory.getMemoryPoolMXBeans()) {
        MemoryUsage usage = mpbean.getCollectionUsage();
        if (usage != null) {
            long max = usage.getMax();
            long used = usage.getUsed();            
            System.out.println(mpbean.getName() + " Used " + used + ", Max " + max);
        }
    }
}

Java 代码输出 -

之前 PS Old Gen 使用 0,最大 21473787904

PS Survivor Space Used 0, Max 89128960

PS Eden Space Used 0, Max 10558111744

之后

PS Old Gen Used 0, Max 21473787904

PS Survivor Space Used 89096256, Max 89128960

PS Eden Space Used 0, Max 10558111744

jcmd 输出 -

jcmd 45766 GC.heap_info 45766: PSYoungGen 总计 611840K,已使用 541937K [0x0000000580100000, 0x00000005cac00000, 0x0000000800000000)

伊甸园空间 524800K,已使用 86% [0x0000000580100000,0x000000059bd44778,0x00000005a0180000)

从空间 87040K,99% 已使用 [0x00000005a0180000,0x00000005a5678040,0x00000005a5680000)

到空间 87040K,使用 0% [0x00000005c5700000,0x00000005c5700000,0x00000005cac00000)

ParOldGen 总计 1398272K,已使用 385048K [0x0000000080200000, 0x00000000d5780000, 0x0000000580100000)

对象空间 1398272K,已使用 27% [0x0000000080200000,0x0000000097a06000,0x00000000d5780000)

已使用元空间 6287K,容量 6411K,已提交 6656K,保留 1056768K

已用类空间 586K,容量 653K,承诺 768K,预留 1048576K

【问题讨论】:

    标签: java memory-management


    【解决方案1】:

    我应该仔细阅读 Javadoc。 MemoryPoolMXBean.getCollectionUsage() 返回最近一次垃圾回收后的内存使用情况。 GC 后 eden 空间为空是正常的。 jcmd GC.heap_info 给出了当前堆使用情况(相当于MemoryPoolMXBean.getUsage()。因此,在本例中,jcmd 输出与问题中code-sn-p 的输出不匹配。

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多