Я хочу отслеживать использование кучи моего кода с помощью java.lang.management.MemoryUsage. В приведенном ниже примере я создаю несколько записей в HashSet, а затем проверяю использование кучи. Я ожидал увидеть ненулевое значение для используемой памяти райского пространства. К моему удивлению, я вижу нулевое значение для использования пространства eden и ненулевое значение для использования пространства оставшихся в живых.
Это не соответствует значениям информации кучи, напечатанным командой jcmd, которая показывает ненулевое использование пространства eden.
Может кто-нибудь помочь мне понять причину этого?
Я использую ParllelOldGC (-XX: + UseParallelOldGC), OpenJDK 11.0.2 в Linux.
Я пытался найти информацию об этом на различных форумах, но не смог найти нужную информацию.
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 Пространство оставшихся в живых 0, Макс. 89128960
PS Eden Space Использовано 0, Макс. 10558111744
* После 1018 *
PS Old Gen Used 0, макс. 21473787904
PS Survivor Space Used 89096256, Макс. 89128960
PS Eden Space Использовано 0, макс. 10558111744
JCMD выход -
jcmd 45766 GC.heap_info
45766:
PSYoungGen всего 611840K, использовано 541937K [0x0000000580100000, 0x00000005cac00000, 0x0000000800000000)
Eden Space 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)
Использовано Metaspace 6287 КБ, емкость 6411 КБ, выделено 6656 КБ, зарезервировано 1056768 К
используется пространство класса 586K, емкость 653K, выделено 768K, зарезервировано 1048576K