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