Я пытаюсь обнаружить утечку памяти в моих java-кодах с помощью java-профайлеров VisualVM. Я хочу сообщить о максимальном использовании памяти до и после устранения утечки памяти. Во время работы VisualVM или других профилировщиков Java можно ли как-то узнать пик использования памяти? Спасибо!
Следите за максимальным использованием памяти в java profiler
Ответы (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. Это хорошее начало .
Вы можете вызвать Runtime.maxMemory()
для того, сколько памяти выделено виртуальной машине (обычно это не уменьшается). Если вы сделаете это в хуке выключения, то значение должно быть довольно точным.
Используйте jmap или -XX:+HeapDumpOnCtrlBreak для точного измерения памяти, используемой вашим приложением в любой момент времени. Оба этих механизма запускают сборщик мусора при создании моментального снимка памяти, поэтому он более точно отражает содержимое и размер кучи. Вы можете использовать jhat, чтобы открыть кучу свалка.