我正在使用jProfiler在Java swing应用程序中查找内存泄漏。我已经确定了一个JFrame的实例,它在数量上不断增长。

此框架已打开,然后关闭。

使用jProfiler,并查看GC Root的路径,只有一个参考,'JNI全局参考'。

这是什么意思?为什么它挂在框架的每个实例上?

有帮助吗?

解决方案

Wikipedia对 Java Native Interface 有一个很好的概述,基本上它允许Java和本机之间的通信用其他语言编写的操作系统库。

JNI全局引用容易出现内存泄漏,因为它们不会自动进行垃圾回收,程序员必须明确释放它们。如果您没有自己编写任何JNI代码,则您使用的库可能存在内存泄漏。

修改 这里是关于本地引用和全局引用的更多信息,以及为什么使用全局引用(以及它们应该如何被释放)

其他提示

JNI全局引用是来自“native”的引用。代码到Java垃圾收集器管理的Java对象。其目的是防止收集仍由本机代码使用的对象,但似乎在Java代码中没有任何实时引用。

JFrame是 java.awt.Window ,并且与“native”相关联。窗口对象。完成特定JFrame实例后,应调用其 dispose()方法进行清理。

我不确定是否有任何本机代码正在创建对JFrame的全局引用,但似乎很可能。如果是这样,这将阻止JFrame被垃圾收集。如果您正在创建许多Windows(或子类)并且发现它们从未被收集过,请确保它们已被丢弃。

在修复JavaFX应用程序中的内存泄漏时,我遇到了这个问题。最后,问题结果是我在调试模式中运行应用程序,并在代码中有几个断点。这似乎导致对象成为“JNI全局引用”并且没有明显原因保存在内存中。当我关闭调试模式时,一切正常!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top