2009-11-19 3 views
3

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

+0

Когда вы собираетесь взять этот след? –

+0

Мне нужно узнать пик использования памяти от начала до конца моего приложения. – flyingfromchina

ответ

2

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

Update:

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

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

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

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

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

+0

Привет, я проверил java.lang.Memory.HeapMemoryUsage, он сообщает только выделенную максимальную память кучи, а не пик использования памяти с начала до конца запуска вашего приложения. – flyingfromchina

+0

О, вы правы, извините. Проверьте мой обновленный ответ, надеюсь, это поможет. – candiru

0

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

0

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