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

前端之家收集整理的这篇文章主要介绍了java – 如何识别JNI全局引用内存泄漏的原因?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Tomcat,在停止我的Web应用程序之后,仍然引用了我的Web应用程序的classloader实例.
结果是显着的内存量(主要与静态数据相关)不会被释放.迟早会导致OutOfMemoryError.

我拿了一个堆栈,我意识到它由一个JNI global reference持有,这阻止了类加载器将是garbage collected.@H_502_4@

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

题:@H_502_4@

有哪些方法/工具集可以实现?@H_502_4@

UPDATE@H_502_4@

看来bestsss是正确的,JNI全局引用已经被jvm调试模式引入.这有助于我,但它并没有回答这个问题,所以我仍然好奇地回答了将来可能会有帮助的问题.@H_502_4@

解决方法

除了明显的情况:线程还有一个:

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

除了系统之外,JVM不支持任何类加载器的引用,但它不涉及您.其余的JNI引用是线程或调试持有的对象(如果您不使用JNI并自己锁定对象).@H_502_4@

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

猜你在找的Java相关文章