我正在使用 Tomcat,在停止我的 Web 应用程序后,仍然存在对我的 Web 应用程序的类加载器实例的引用。
结果是大量内存(主要与静态数据相关)不会被释放。这迟早会导致 OutOfMemoryError
。
我做了一个heap dump
,然后我意识到它由一个 JNI global reference 持有 防止类加载器将是 garbage collected .
我的应用程序不使用 JNI。我也没有使用 Apache Tomcat Native Library。我正在使用 Sun/Oracle JDK。
我想追查这个全局引用的原因/来源。
(我的猜测是 JVM 内部引用了类加载器 - 但为什么/在哪里?)。
问题:
- 有哪些方法/工具集可以实现这一点?
更新
看来bestsss是对的,JNI全局引用已经被jvm Debug模式引入了。这帮助了我,但它没有回答问题,所以我仍然很想得到这个问题的答案,这可能对 future 有帮助。
最佳答案
除了明显的情况:线程,还有一个:
您是否在 Debug模式下使用您的应用程序?
JVM 不保存对除系统类加载器之外的任何类加载器的引用,但这与您无关。其余的 JNI 引用要么是线程,要么只是调试持有的对象(前提是您不使用 JNI 并自己锁定对象)。
JNI 引用只是根,编辑您的答案并发布这些引用所持有的确切对象。
关于java - 如何确定 JNI 全局引用内存泄漏的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6423873/