Лучший способ профилировать использование памяти в приложении Java? - PullRequest
24 голосов
/ 16 апреля 2009

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

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

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

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

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

Ответы [ 9 ]

16 голосов
/ 16 апреля 2009

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

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

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

Примечание: TI JVM заменяет интерфейс профилировщика виртуальной машины Java (JVMPI) и интерфейс отладки виртуальной машины Java (JVMDI). JVMPI и JVMDI будут удалены в следующем основном выпуске J2SETM.

6 голосов
/ 16 апреля 2009

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

4 голосов
/ 16 апреля 2009

Вы проверили

VisualVM и Eclipse-Callisto ?

3 голосов
/ 16 апреля 2009

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

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

Возможно, вам хватит для начала.

2 голосов
/ 26 апреля 2009

Вы можете использовать jrcmd , которая является утилитой командной строки, которая поставляется с JVM JRockit. Если вы знаете 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
 ...
2 голосов
/ 17 апреля 2009

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

2 голосов
/ 16 апреля 2009

Некоторые профилировщики, такие как yourkit , имеют API для отслеживания выделения памяти. Другой вариант - инструменты мониторинга, такие как jxinsight . или стеклянная коробка или хамон

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

1 голос
/ 11 марта 2013

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

1 голос
/ 16 апреля 2009

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

...