gpt4 book ai didi

java - jcmd 和 java.lang.management.MemoryUsage 报告的 eden 空间使用值之间的差异

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:38 31 4
gpt4 key购买 nike

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

我在 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 老一代已使用 0,最大 21473787904

PS 幸存者空间已用 0,最大 89128960

PS Eden 空间已使用 0 个,最大 10558111744

之后

PS 老一代已使用 0,最大 21473787904

PS幸存者空间已用89096256,最大89128960

PS Eden 空间已使用 0 个,最大 10558111744

jcmd 输出 -

jcmd 45766 GC.heap_info45766: 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,已 promise 768K,保留1048576K

最佳答案

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

关于java - jcmd 和 java.lang.management.MemoryUsage 报告的 eden 空间使用值之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56118689/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com