【发布时间】: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
【问题讨论】: