问题描述
用 jProfiler 分析 Java swing 程序中的内存泄漏问题时, 我发现内存中 JFrame 实例的数量一直在增加。
各个 frame 被打开(opened),然后被关闭(closed)。
通过 jProfiler, 并查看GC Root时, 只找到一项: ‘JNI Global reference’。
这是什么意思? 为什么他 hang 住了所有的 frame 实例?
回答1
请查看《维基百科》中关于 Java本地接口 的介绍, 本质上它允许 Java程序 和系统库之间进行通信。
JNI全局引用很容易造成内存泄漏, 因为它们不能被自动垃圾收集所清理, 程序员必须显式地释放它们. 如果你没有编写任何JNI代码, 那么狠可能是使用的库中存在内存泄漏。
修正: 请参考关于 local vs. global references 的更多信息. 其中介绍了为什么要使用全局引用(以及如何进行释放)。
回答2
JNI全局引用(JNI global reference), 是从 “native” 代码指向堆内存中Java对象的引用. 其存在的目的是阻止垃圾收集器, 不要误将 native 代码中仍在使用的对象给回收了, 假如这些Java对象没有Java代码引用到他们的话。
一个 JFrame 实例就是一个窗口(java