Класс NMT совершенный против Jstat Compressed Class Space - PullRequest
0 голосов
/ 18 октября 2019

Я исследую проблему OutOfMemoryError: сжатое пространство классов. Я думаю, что я нашел свою основную причину и решение для нее (JAXBContext.newInstance (), вызванный методом Hibernate Validator: buildValidatorFactory после каждого отправленного действия пользователем), но во время моего исследования я заметил одну непонятную вещь.

Я пытался запустить jcmd VM.native_memory и jstat -gc для отслеживания фиксированного размера класса и CCSU (сжатое использование пространства класса):

d:\experiments>jcmd 59692 VM.native_memory summary
Native Memory Tracking:

Total: reserved=10039335KB, committed=889895KB
-                 Java Heap (reserved=8353792KB, committed=522240KB)
                            (mmap: reserved=8353792KB, committed=522240KB)

-                     Class (reserved=1072460KB, **committed=24268KB**)
                            (classes #2518)
                            (malloc=9548KB #2393)
                            (mmap: reserved=1062912KB, committed=14720KB)

и

d:\experiments>jstat -gc 59692 2s
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
21504,0 21504,0  0,0    0,0   131072,0 56218,7   139264,0    7755,5   14976,0 14318,5 1920,0 1721,7      2    0,012   1      0,036   -          -    0,048

Я ожидалчто нет существенной разницы между метрикой «фиксация класса» в NMT и CCSU в jstat, но jstat показывает только 1,72 МБ используемой памяти по сравнению с Class Committed, что составляет более 24 МБ. Итак, я сгенерировал статистику GC.class_stats, и она показывает, что KlassBytes составляет около 1738616 B -> 1739 МБ - так что это примерно то же значение, что jstat показывает в CCSU. Также я обнаружил, что остальные метаданные, такие как Methods, Constants и т. Д.) Занимают около 14,44 МБ (это примерно то же самое, что значение в mmap: commit = 14720KB - но я не знаю, что это за число).

Так где же все остальное? Что именно представляет число, представленное NMT?

1 Ответ

1 голос
/ 19 октября 2019
В разделе

Class в отчете по отслеживанию собственной памяти показаны агрегированные числа как для метас пространства , так и сжатого пространства классов . Различие между Metaspace и Сжатым классовым пространством объясняется здесь .

Metaspace vs. Compressed Class Space

Слайд из Память процесса Java * презентация


jstat метрики MC, MU, CCSC и CCSUподставка для

  • Емкость Metaspace
  • Используемое Metaspace
  • Емкость сжатого пространства класса
  • Используемое пространство сжатого класса

Отношение между Совершено , Емкость и Используется объясняется в этот ответ .

Итак, Класс Committed , как показывает Native Memory Tracking, связан с метриками jstat со следующим неравенством:

Class Committed >= MC + CCSC >= MU + CCSU

Однако разница между ними может быть произвольно большой.


Начиная с JDK 10, в отчете об отслеживании собственной памяти приводятся подробные сведения о разделе Class:

-     Class (reserved=1073841KB, committed=28593KB)
            (classes #3967)
            (  instance classes #3694, array classes #273)
            (malloc=689KB #9228) 
            (mmap: reserved=1073152KB, committed=27904KB) 
            (  Metadata:   )
            (    reserved=24576KB, committed=24576KB)
            (    used=24131KB)
            (    free=445KB)
            (    waste=0KB =0.00%)
            (  Class space:)
            (    reserved=1048576KB, committed=3328KB)
            (    used=3003KB)
            (    free=325KB)
            (    waste=0KB =0.00%)
...