什么是'JNI全球参考'

j.d*_*ies 23 java swing jprofiler

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

此框架打开,然后关闭.

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

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

eri*_*son 16

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

JFrame是a java.awt.Window,并且与"本机"Window对象相关联.完成特定JFrame实例后,应调用其dispose()方法进行清理.

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


小智 13

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

  • 糟糕,这正是发生在我身上的事! (2认同)

Pet*_*ter 11

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

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

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

  • 维基百科是次要来源.主要来源和官方文件是[JNI规范](http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html). (3认同)