Используя jdk1.8.0_152
Я пытаюсь отследить, какая часть моей Java-программы использует больше всего памяти (в основном в куче)
Используя top
Я вижу, что весь процесс использует около 1,109G остаточной памяти
Использование jcmd {PID} VM.native_memory
Я вижу, что общее зарезервированное значение составляет 4704896 КБ, а выделенное - около 1290820 КБ. Committed - это немного больше, чем остаточная память, но я читал, что не вся выделенная память могла быть перенесена в реальную память, поэтому я не очень обеспокоен этой разницей
Основная проблема, которая у меня сейчас есть, - это разницамежду использованием памяти кучи от VM.native_memory
и общим использованием кучи при использовании jcmd {PID} GC.class_histogram
Я также попытался сравнить использование кучи с помощью jstat -gc {PID}
и получил результаты, аналогичные GC.class_histogram
Согласно GC.class_histogram
и jstat -gc
, использование кучи составляет около 250 МБ, но использование использования кучи VM.native_memory
(зафиксировано в разделе Java Heap
) составляет около 1000000 КБ (так немного меньше 1 ГБ), но реальная память RSS кажетсячтобы быть ближе к общему количеству, зафиксированному в VM.native_memory
На мой взгляд, прямо сейчас VM.native_memory
Java Heap содержит память, которая не была собрана сборщиком мусора, но даже когда я запускаю сборку мусора, я вижу, что результат jstat -gc
резко уменьшается, в то время как VM.native_memory
не изменяется вообще (хотя я слышал, что пользователь, вручную запускающий сборку мусора, не всегда приводит кполная сборка мусора, но кажется, что, по крайней мере, jstat -gc
соответствует результату GC.class_histogram
.
Еще одна вещь, которую я слышал, это то, что остаточная память из top
не всегда освобождается, когда процессиспользование памяти освобождает ее до тех пор, пока она полностью не освободится.
Итак, чтобы подвести итог
- Почему
VM.native_memory
показывает другое использование памяти кучи от jstat
и GC.class_histogram
? - Какой показатель следует использоватьчтобы убедиться, сколько памяти использует мой процесс Java? (учитывая, что остаточная память в
top
не всегда отражает фактическое использование)