Собственная память Java отслеживает кучи, выделенную из дампа кучи намного больше, чем общее - PullRequest
0 голосов
/ 30 сентября 2019

Используя 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 не всегда освобождается, когда процессиспользование памяти освобождает ее до тех пор, пока она полностью не освободится.

Итак, чтобы подвести итог

  1. Почему VM.native_memory показывает другое использование памяти кучи от jstat и GC.class_histogram?
  2. Какой показатель следует использоватьчтобы убедиться, сколько памяти использует мой процесс Java? (учитывая, что остаточная память в top не всегда отражает фактическое использование)
...