我正在使用 Tomcat,停止我的 Web 应用程序后仍然存在对类加载器的引用我的网络应用程序的实例。
结果是大量内存(主要与静态数据相关)将不会被释放。迟早这会导致OutOfMemoryError
.
我拍了一张heap dump
我意识到它是由一个JNI 全局参考 http://java.sun.com/docs/books/jni/html/refs.html which prevents类加载器将是垃圾收集 http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/html/jni_gc.html.
我的应用程序不使用JNI。我也没有使用Apache Tomcat 本机库。我使用的是 Sun/Oracle JDK。
我想追踪这个全球参考的原因/起源。
(我的猜测是 JVM 在内部引用类加载器 - 但为什么/在哪里?)。
问题:
UPDATE
看来bestsss是对的,jvm调试模式引入了JNI全局引用。这帮助了我,但它没有回答问题,所以我仍然很好奇得到这个问题的答案,这可能在未来有所帮助。
除了明显的情况:线程之外,还有一个:
您是否在调试模式下使用您的应用程序?
除了系统类加载器之外,JVM 不保存对任何类加载器的引用,但它与您无关。其余的 JNI 引用要么是线程,要么只是调试持有的对象(前提是您不使用 JNI 并自己锁定对象)。
JNI 引用只是根,编辑您的答案并发布这些引用到底包含哪些对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)