我正在使用Tomcat,在停止我的Web应用程序之后,仍然引用了我的Web应用程序的classloader实例.
结果是显着的内存量(主要与静态数据相关)不会被释放.迟早会导致OutOfMemoryError.
结果是显着的内存量(主要与静态数据相关)不会被释放.迟早会导致OutOfMemoryError.
我拿了一个堆栈,我意识到它由一个JNI global reference持有,这阻止了类加载器将是garbage collected.
我的应用程序不使用JNI.我也不使用Apache Tomcat Native Library.我正在使用Sun / Oracle JDK.
我想跟踪这个全球参考的原因/起源.
(我的猜测是JVM内部引用了类加载器 – 但是为什么/在哪里?).
题:
有哪些方法/工具集可以实现?
UPDATE
看来bestsss是正确的,JNI全局引用已经被jvm调试模式引入.这有助于我,但它并没有回答这个问题,所以我仍然好奇地回答了将来可能会有帮助的问题.
解决方法
除了明显的情况:线程还有一个:
您是否在调试模式下使用应用程序?
除了系统之外,JVM不支持任何类加载器的引用,但它不涉及您.其余的JNI引用是线程或调试持有的对象(如果您不使用JNI并自己锁定对象).
JNI引用只是根,编辑你的答案,并发布这些引用所持有的对象.