java - 如何确定 JNI 全局引用内存泄漏的原因?

标签 java tomcat memory-leaks garbage-collection java-native-interface

我正在使用 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/

相关文章:

java - 使用 JAX-RS 和 Liferay (Apache CXF) 实现 PATCH 端点

java - onSuccess 调用后,executeTransactionAsync 不会刷新数据

java - 测量JAVA中一段代码占用的CPU时间

tomcat - IIS 重写和重定向

rest - 如何列出对服务器进行的 REST API 调用

java - tomcat 8.0.32 - 生产服务器中 Server.xml 配置中的性能调整

java - JMX RMI - 内存泄漏 - ArrayNotificationBuffer 随着时间的推移越来越大

.net - 嵌入式 IronPython 内存泄漏

java - 错误模拟 android ionic 框架

无法在 32 位 Linux 中耗尽物理内存