什么是“JNI 全球参考”

2022-09-01 09:39:50

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

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

使用jProfiler,并查看GC根目录的路径,只有一个引用,“JNI全局引用”。

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


答案 1

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

JFrame 是一个 ,它与一个“本机”窗口对象相关联。当您完全完成对特定 JFrame 实例的处理后,您应该调用其方法来清理。java.awt.Windowdispose()

我不确定是否有任何本机代码正在创建对JFrame的全局引用,但似乎很有可能。如果是这样,这将防止对 JFrame 进行垃圾回收。如果要创建许多 Windows(或子类)并看到它们从未被收集,请确保已释放它们。


答案 2

维基百科对Java Native Interface有很好的概述,本质上它允许Java和用其他语言编写的原生操作系统库之间的通信。

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

编辑 这里 是关于本地引用与全局引用的更多信息,以及为什么使用全局引用(以及如何释放它们)


推荐