我有一些我运行的第三个库代码,经过一段时间后我遇到了OutOfMemoryError
。所以我启动了Eclipse MAT并分析了内存。现在似乎无法处理内存,因为有一个对象显示为GC root: Native Stack
。阅读documentation:
本机代码中的in或out参数,例如用户定义的JNI代码或JVM内部代码。这通常是这种情况,因为许多方法具有本机部分,并且作为方法参数处理的对象成为GC根。例如,用于文件/网络I / O方法或反射的参数。
现在我的问题是:如何确认该对象是在JNI或其他地方使用的(即如何找到使用它的代码)?我可以以某种方式处置对象吗?我还有其他选择吗?
感谢您的帮助!
答案 0 :(得分:8)
显示为GC root: Native Stack
的对象被证明是Eclipse调试器的问题。当应用程序在没有调试器的情况下启动时(即使用'run'而不是'debug'),问题就消失了。这也是我找不到我的项目中JNI中使用的对象的代码的原因(因为它们不是)。
在没有调试的情况下查找真正的内存泄漏有点困难,但使用Eclipse MAT及其“查找泄漏嫌疑人”功能帮助很多!
答案 1 :(得分:-1)
如果您无法访问源代码,可以尝试使用任何可用的反编译工具对其进行反编译(前提是代码未经过模糊处理)。然后你可以分析源代码。