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