什么是“JNI 全球参考”
我正在使用jProfiler来查找Java swing应用程序中的内存泄漏。我已经确定了一个JFrame的实例,它的数量不断增长。
此框架被打开,然后关闭。
使用jProfiler,并查看GC根目录的路径,只有一个引用,“JNI全局引用”。
这是什么意思?为什么它挂在帧的每个实例上?
我正在使用jProfiler来查找Java swing应用程序中的内存泄漏。我已经确定了一个JFrame的实例,它的数量不断增长。
此框架被打开,然后关闭。
使用jProfiler,并查看GC根目录的路径,只有一个引用,“JNI全局引用”。
这是什么意思?为什么它挂在帧的每个实例上?
JNI 全局引用是从“本机”代码到由 Java 垃圾回收器管理的 Java 对象的引用。其目的是防止收集本机代码仍在使用的对象,但在 Java 代码中似乎没有任何实时引用。
JFrame 是一个 ,它与一个“本机”窗口对象相关联。当您完全完成对特定 JFrame 实例的处理后,您应该调用其方法来清理。java.awt.Window
dispose()
我不确定是否有任何本机代码正在创建对JFrame的全局引用,但似乎很有可能。如果是这样,这将防止对 JFrame 进行垃圾回收。如果要创建许多 Windows(或子类)并看到它们从未被收集,请确保已释放它们。
维基百科对Java Native Interface有很好的概述,本质上它允许Java和用其他语言编写的原生操作系统库之间的通信。
JNI 全局引用容易发生内存泄漏,因为它们不会自动进行垃圾回收,程序员必须显式释放它们。如果您没有自己编写任何 JNI 代码,则可能是您正在使用的库存在内存泄漏。
编辑 这里 是关于本地引用与全局引用的更多信息,以及为什么使用全局引用(以及如何释放它们)