MAT中显示的内存泄漏为GC根:本机堆栈

时间:2014-08-06 13:10:05

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

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

  

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:-1)

如果您无法访问源代码,可以尝试使用任何可用的反编译工具对其进行反编译(前提是代码未经过模糊处理)。然后你可以分析源代码。