Следите за максимальным использованием памяти в java profiler

Я пытаюсь обнаружить утечку памяти в моих java-кодах с помощью java-профайлеров VisualVM. Я хочу сообщить о максимальном использовании памяти до и после устранения утечки памяти. Во время работы VisualVM или других профилировщиков Java можно ли как-то узнать пик использования памяти? Спасибо!


person flyingfromchina    schedule 19.11.2009    source источник
comment
Когда ты собираешься оставить этот след?   -  person Pascal Thivent    schedule 19.11.2009
comment
Мне нужно узнать пик использования памяти от начала до конца моего приложения.   -  person flyingfromchina    schedule 19.11.2009


Ответы (3)


Вы можете сделать это с помощью VisualVM. Сначала установите подключаемый модуль VisualVM-MBeans и перезапустите VisualVM. После этого на новой вкладке MBeans выберите java.lang.Memory.HeapMemoryUsage. Максимальное значение даст вам максимальный выделенный объем памяти.

Обновление:

Я дважды проверил это, и HeapMemoryUsage.max действительно не является пиковым использованием кучи. К счастью, в java.lang.MemoryPool.‹Generation›.PeakUsage.used есть статистика пикового использования для каждого поколения. Чтобы проверить это, я написал небольшую программу, которая выделяет немного памяти, и PeakUsage.max для Eden Space плюс Old Gen плюс Survivor Space дает желаемое пиковое использование кучи.

Итак, вот что вы можете сделать:

  • Вы можете использовать эту статистику по поколениям. Вы также можете написать небольшой инструмент, который вычисляет и печатает сумму пикового использования каждого поколения для данного процесса через JMX.

  • Если вам нужно только некоторое приближение, вы можете проверить вкладку «Монитор» в VisualVM, фиолетовая область на диаграмме кучи — это «используемая куча», поэтому вы также можете получить некоторое представление о пиковом использовании.

  • Если вам это нужно, чтобы устранить утечку памяти, вам действительно нужен шаблон долговременного выделения памяти, и опять же, он доступен на диаграмме кучи в VisualVM. Это хорошее начало .

person candiru    schedule 19.11.2009
comment
Привет, я проверил java.lang.Memory.HeapMemoryUsage, он сообщает только о максимальной выделенной памяти кучи, а не о пике использования памяти от начала до конца запуска вашего приложения. - person flyingfromchina; 20.11.2009
comment
О, ты прав, извини. Проверьте мой обновленный ответ, надеюсь, это поможет. - person candiru; 21.11.2009

Вы можете вызвать Runtime.maxMemory() для того, сколько памяти выделено виртуальной машине (обычно это не уменьшается). Если вы сделаете это в хуке выключения, то значение должно быть довольно точным.

person Aaron Digulla    schedule 19.11.2009

Используйте jmap или -XX:+HeapDumpOnCtrlBreak для точного измерения памяти, используемой вашим приложением в любой момент времени. Оба этих механизма запускают сборщик мусора при создании моментального снимка памяти, поэтому он более точно отражает содержимое и размер кучи. Вы можете использовать jhat, чтобы открыть кучу свалка.

person Amir Afghani    schedule 19.11.2009