Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Вы можете использовать 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
 ...

Ответ 8

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

Ответ 9

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