2015-07-28 4 views
4

У нас есть приложение Java, которое использует SWT и некоторые другие DLL через JNA в среде Windows 7.Как обнаружить утечку памяти в приложении Java за пределами кучи?

Мы видели, что использование памяти JVM увеличивается со временем, но куча JVM относительно устойчива при нормальной работе GC.

Мы подозреваем, что есть утечка памяти из SWT и/или JNA/DLL, но не может быть уверен, почему и где.

Есть ли какие-либо инструменты на платформе Windows, которые могут помочь обнаружить такую ​​проблему? Или любое средство на платформе Java, которое может помочь решить эту проблему? Любое предложение приветствуется.

+0

Наиболее распространенная утечка с помощью SWT - это приложение, которое не может «распоряжаться» такими вещами, как «Цвет» –

ответ

2

В Java 8 есть переключатель командной строки: -XX:NativeMemoryTracking=<value>, где значение может быть off, summary или detail.

Вы можете установить это на detail, а затем вы можете запросить его, используя jcmd.

На этом here имеется официальная документация. Однако эта функция довольно ограничена, но может помочь найти причину.


В противном случае, грубый, но эффективный способ идентификации источника проблемы является замена DLL с фиктивной версии (или даже неродной манекена) и посмотреть, если вы можете воспроизвести ту же самую проблему.

+1

«Поскольку NMT не отслеживает выделения памяти по не-JVM-коду, вам, возможно, придется использовать инструменты, поддерживаемые операционной системой для обнаружения утечек памяти в собственном коде ». К моему неуправляемому глазу, который звучит так, он не поможет справиться с утечками памяти за пределами кучи JVM. Если я ошибаюсь, вы можете уточнить, как мне хотелось бы узнать больше об этой теме. – Joeblade

+1

@Joeblade. Исходная память выделяется кодом JVM для других целей, это не просто куча, которую вы можете изучить с ней. Но да, у него есть свои ограничения, и в этом случае это может не сработать. Это все еще особенность, о которой стоит знать. – biziclop

+0

@bizclop :) Да, именно поэтому я надеялся уговорить вас в разработке. Я не слышал об этом раньше, поэтому мне было любопытно. – Joeblade