【问题标题】:Memory leak shown in MAT as GC root: Native StackMAT 中显示为 GC 根的内存泄漏:本机堆栈
【发布时间】:2014-09-29 10:39:15
【问题描述】:

我运行了一些第三个库代码,一段时间后我遇到了OutOfMemoryError。所以我启动了 Eclipse MAT 并分析了内存。现在似乎无法释放内存,因为有一个显示为GC root: Native Stack 的对象。阅读documentation

本机代码中的输入或输出参数,例如用户定义的 JNI 代码或 JVM 内部代码。这通常是因为许多方法具有本机部分,并且作为方法参数处理的对象成为 GC 根。例如,用于文件/网络 I/O 方法或反射的参数。

现在我的问题是:如何确认该对象在 JNI 或其他地方使用(即如何找到使用它的代码)?我可以以某种方式处理该对象吗?我还有哪些其他选择?

已经感谢您的帮助!

【问题讨论】:

    标签: java memory-leaks java-native-interface out-of-memory


    【解决方案1】:

    显示为GC root: Native Stack 的对象原来是Eclipse 调试器的问题。当应用程序在没有调试器的情况下启动时(即使用“运行”而不是“调试”),问题就消失了。这也是我在项目中找不到 JNI 中使用的对象的代码的原因(因为它们不是)。

    在不调试的情况下找到真正的内存泄漏有点困难,但使用 Eclipse MAT 及其“查找泄漏嫌疑人”功能帮助很多

    【讨论】:

    • 你知道为什么 Eclipse 调试器会保留类并阻止它们被卸载吗?
    • 使用 IntelliJ Debugger 时出现同样的问题。
    【解决方案2】:

    如果您无权访问源代码,您可以尝试使用任何可用的反编译工具对其进行反编译(前提是代码没有被混淆)。然后你就可以分析源代码了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多