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

StackOverflow https://stackoverflow.com/questions/756873

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

Видеть http://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html

Возможно, вам этого будет достаточно для начала.

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

Для анализа дампов кучиАнализатор памяти 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
 ...

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top