Инструменты для собственного анализа утечек памяти - PullRequest
7 голосов
/ 28 июля 2011

Я подозреваю утечку памяти в моем Java-коде.Существуют ли инструменты для профилирования памяти?Кроме того, поддерживает ли какой-либо инструмент собственный анализ памяти работающего процесса Java?

Спасибо!

Редактировать: я уже пробовал Memory Validator и Purify, но, похоже, они поддерживают только 32-битные процессы.Существует ли какой-либо инструмент, похожий на вышеупомянутые, который может просто присоединиться к запущенному процессу Windows и дать нам анализ собственной памяти для этого конкретного процесса?

Ответы [ 5 ]

4 голосов
/ 28 июля 2011

Руководство по устранению неполадок для Java SE 6 с Hotspot VM содержит довольно сложный раздел, посвященный методам, помогающим обнаруживать утечки памяти.К ним относятся:

  • упаковка всех вызовов выделения и освобождения памяти для отслеживания объема используемой памяти.
  • полагаясь на поддержку конкретной платформы, такую ​​как поддержка отладки, предоставляемая компилятором Microsoft Visual C ++, илина mtrace (и MALLOC_TRACE) для отладки выделения памяти в Linux.
  • с использованием таких инструментов анализа утечек памяти, как Rational Purify.

и других.В частности, в статье упоминается, что не существует идеального решения для всех платформ.

Кроме того, рассмотрите возможность использования флага -Xcheck:jni, который, по-видимому, доступен в большинстве JVM.Сам флаг -X указывает, что этот флаг нестандартный, но этот флаг, по-видимому, доступен в IBM JDK , Oracle JRockit R28 и даже в Oracle / Sun JVM,Включение флага включает режим, в котором обертки добавляются к вызовам JNI, что позволяет отслеживать недопустимые аргументы, передаваемые вызовам JVM, как указано в руководстве и спецификации для программистов JNI .Хотя его использование при обнаружении утечек памяти носит субъективный характер, оно определенно поможет, если вы подозреваете, что утечка вызвана неправильными параметрами.

2 голосов
/ 28 июля 2011

AFAIK вы не можете сделать это с помощью таких инструментов Java, как JProfiler, JVisualVM и т. Д. Если у вас есть утечка памяти в нативном коде, используйте инструменты для нативного кода.Вы т.е.может запустить его из C (т.е. загрузка jvm.dll).Вы можете посмотреть в этой статье поиск утечек памяти с помощью Visual Studio или Обнаружение утечек памяти в C ++ (Linux)

Примечание: конечно, если утечка связана с кучейУтечка (забыл про deleteglobalref) вы можете найти его с помощью инструментов Java, но это очень редко в JNI.

1 голос
/ 09 июля 2016

Я работал над проектом с открытым исходным кодом с именем "MySafe" (https://github.com/serkan-ozal/mysafe). Он в основном перехватывает и отслеживает вызовы "Небезопасный". (На самом деле, он делает больше, чем). С версией 2.0 он можетполезно для отслеживания и обнаружения утечек памяти на основе «небезопасных».

Демонстрационный код: https://github.com/serkan-ozal/mysafe/blob/master/src/test/java/tr/com/serkanozal/mysafe/NativeMemoryLeakHuntingDemo.java

Диаграмма, показывающая источник утечки: https://github.com/serkan-ozal/mysafe/blob/master/src/test/resources/native-memory-leak-hunting.png

0 голосов
/ 11 октября 2018

Для диагностики собственной утечки памяти требуются средства отображения символов JIT и последние инструменты профилирования Linux: perf, perf-map-agent и bcc.

См. Подробности в соответствующем ответе https://stackoverflow.com/a/52767721/737790

Большое спасибо Брендан Грегг

0 голосов
/ 28 июля 2011

Я большой поклонник JProfiler.Это лучший инструмент для профилирования и утечек памяти.Это довольно дешево по сравнению с большинством инструментов, действительно прост в освоении и имеет множество функций.

http://www.ej -technologies.com / products / jprofiler / Overview.html

...