Разница между значениями использования пространства eden, сообщаемыми jcmd и java.lang.management.MemoryUsage - PullRequest
1 голос
/ 13 мая 2019

Я хочу отслеживать использование кучи моего кода с помощью 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

1 Ответ

0 голосов
/ 31 мая 2019

Я должен был внимательно прочитать Javadoc. MemoryPoolMXBean.getCollectionUsage () возвращает использование памяти после последней сборки мусора . Это нормально для пространства eden, чтобы быть пустым после GC. jcmd GC.heap_info показывает текущее использование кучи (эквивалент MemoryPoolMXBean.getUsage () . Следовательно, в этом примере вывод jcmd не совпадает с выводом фрагмента кода в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...