Лучший способ профилировать использование памяти в приложении Java?

Я понимаю, что подобные вопросы задавались об этом раньше здесь, на SO, но позвольте мне точно описать, что мне нужно сделать:

У меня есть набор тестов, которые запускают java-приложение командной строки, и я хотел бы добавить к ним профилирование памяти. Один из вариантов, который я вижу, - добавить код (возможно, используя сторонние инструменты/библиотеки) в мое приложение, которое предоставит снимок памяти. Другой вариант - использовать сторонний инструмент, который управляет / инструменты мое приложение и JVM для меня (и в идеале не требует, чтобы я менял свой код). Я думаю о чем-то вроде Valgrind, но для Java. Также с открытым исходным кодом, если это вообще возможно.

Что я действительно хотел бы сделать, так это настроить тесты памяти так, чтобы мое использование памяти контролировалось через регулярные промежутки времени, скажем, каждую секунду, и сбрасывалось в текстовый файл. Таким образом, я смогу увидеть, колеблется ли использование памяти/увеличивается/уменьшается с течением времени. Я также смогу вычислить максимальные и минимальные пики.

кто-нибудь здесь делал что-нибудь подобное?

спасибо заранее.

9 ответов


с чем-то вроде JProfiler все, что вам нужно сделать, это добавить определенные параметры в JVM. Он использует JVMTI.

Я думаю, вы должны читать о профилировщиках и точно, что они могут сделать для вас. Я также предлагаю прочитать о JVMTI.

интерфейс инструмента JVMTM (JVM TI) новый родной интерфейс программирования для пользы инструментами. Он предоставляет как способ проверить состояние, так и контролировать выполнение приложений, запущенных в виртуальной машине Java (JVM). JVM TI поддерживает полную широту инструментов, которым необходим доступ к состоянию JVM, включая, но не ограничиваясь: профилирование, отладку, мониторинг, анализ потоков и инструменты анализа покрытия.

Примечание: JVM TI заменяет Java Virtual Machine Profiler Interface (JVMPI) и Java Virtual Machine Debug Interface (JVMDI). JVMPI и JVMDI будут удалены в следующем крупном выпуске J2SETM.


Yourkit также имеет довольно хороший профайлер



хорошее место для начала, чтобы увидеть, поддерживает ли ваш JVM "java-Xrunhprof", поскольку это может генерировать информацию профилирования кучи, не делая ваш сценарий более сложным.

см.http://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html

вы можете найти, что достаточно для вас, чтобы начать.


различные приложения, таких как yourkit есть API для трассировки выделений памяти. Другой вариант здесь - инструменты мониторинга, такие как jxinsight или движку glassbox или хамоном

для анализа кучи выводитАнализатор Памяти Eclipse это лучший инструмент, который вы можете получить. Это бесплатный и с открытым исходным кодом, так что вы можете автоматизировать анализ кучи свалок столько, сколько вы хотите.


Я развиваюсь в Eclipse, но у меня есть Netbeans, чтобы использовать его отличный профилировщик. Он ограничен по сравнению с некоторыми коммерческими, но все же достаточно хорош для обнаружения большинства узких мест


можно использовать jrcmd который является утилитой командной строки, которая поставляется с JRockit JVM. Если вы знаете pid процесса Java, вы можете просто сделать:

JROCKIt_HOME\bin\jrcmd <pid> print_object_summary

и это даст вам:

31.8% 3198k    41907   -137k [C
11.9% 1196k      300     +0k [B
11.4% 1151k    49118     +6k java/lang/String
 6.1% 612k     5604     +0k java/lang/Class
 4.3% 431k     2388     +0k [I
 3.5% 353k    15097     +0k java/util/HashMap$Entry
 ...

в дополнение к приведенным выше ответам мне также понравилось использовать profiler пару лет назад. Не знаю, поможет ли это.


Я рекомендую выпуск dynaTrace production edition. Удивительный инструмент для профилирования приложения памяти. Низкие накладные расходы и 100% совершенных сделок.