如何识别JNI全局引用内存泄漏的原因?

MRa*_*ser 10 java java-native-interface tomcat garbage-collection memory-leaks

我正在使用Tomcat,在停止我的Web应用程序后,仍然会引用我的Web应用程序的类加载器实例.结果是不会释放大量的内存(主要与静态数据相关).迟早会导致这种情况发生OutOfMemoryError.

我拿了一个heap dump,我意识到它由JNI全局引用保存,它可以防止类加载器被垃圾收集.

我的应用程序不使用JNI.我也没有使用Apache Tomcat Native Library.我正在使用Sun/Oracle JDK.
我想跟踪这个全球参考的原因/来源.(我的猜测是JVM内部引用了类加载器 - 但为什么/在哪里?).

题:

  • 有哪些方法/工具集可以实现这一目标?

UPDATE

似乎bestsss是正确的,jnm调试模式引入了JNI全局引用.这帮助了我,但它没有回答这个问题所以我仍然很想回答可能对将来有帮助的问题.

bes*_*sss 19

除了明显的案例:线程,还有一个:

您是否在调试模式下使用您的应用程序?

除了系统之外,JVM不保留对任何类加载器的引用,但它与您无关.其余的JNI引用是Threads或只是调试持有的对象(前提是你不使用JNI并自己锁定对象).

JNI引用只是根,编辑您的答案并发布这些引用所持有的对象.


ear*_*cam 0

JRockit 任务控制:http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/tools/index.html

一个不错的 GUI 工具,应该可以帮助您快速找到它。