Лучший способ профилировать использование памяти в приложении 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.
хорошее место для начала, чтобы увидеть, поддерживает ли ваш 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% совершенных сделок.