Я исследую проблему 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?