Java 什么是';JNI全球参考';
我正在使用jProfiler查找Java swing应用程序中的内存泄漏。我已经确定了一个JFrame的实例,它的数量在不断增长 此框架打开,然后关闭 使用jProfiler,并查看到GC根目录的路径,只有一个引用“JNI全局引用”Java 什么是';JNI全球参考';,java,swing,jprofiler,Java,Swing,Jprofiler,我正在使用jProfiler查找Java swing应用程序中的内存泄漏。我已经确定了一个JFrame的实例,它的数量在不断增长 此框架打开,然后关闭 使用jProfiler,并查看到GC根目录的路径,只有一个引用“JNI全局引用” 这是什么意思?为什么它会挂在框架的每个实例上?Wikipedia有一个很好的概述,本质上它允许Java和用其他语言编写的本机操作系统库之间的通信 JNI全局引用容易发生内存泄漏,因为它们不会被自动垃圾收集,程序员必须显式地释放它们。如果您自己没有编写任何JNI代码,
这是什么意思?为什么它会挂在框架的每个实例上?Wikipedia有一个很好的概述,本质上它允许Java和用其他语言编写的本机操作系统库之间的通信 JNI全局引用容易发生内存泄漏,因为它们不会被自动垃圾收集,程序员必须显式地释放它们。如果您自己没有编写任何JNI代码,那么您正在使用的库可能存在内存泄漏
edit是关于本地引用与全局引用的更多信息,以及为什么使用全局引用(以及如何释放它们)JNI全局引用是从“本机”代码到Java垃圾收集器管理的Java对象的引用。它的目的是防止收集本机代码仍在使用但在Java代码中似乎没有任何活动引用的对象 JFrame是一个
java.awt.Window
,与一个“本机”窗口对象相关联。当您完成特定JFrame实例的处理后,应该调用其dispose()
方法进行清理
我不确定是否有任何本机代码正在创建对JFrame的全局引用,但这似乎是可能的。如果确实如此,这将防止JFrame被垃圾收集。如果您正在创建许多窗口(或子类),并且发现它们从未被收集,请确保它们已被释放。我在修复JavaFX应用程序中的内存泄漏时遇到了这个问题。最后的问题是,我在调试模式下运行应用程序,代码中有几个断点。这似乎导致对象成为“JNI全局引用”,并毫无理由地保存在内存中。当我关闭调试模式时,一切正常 如果代码只是Java,这是最有可能的解释。我在全局指针方面遇到了一些问题,但我一直在使用JNI。维基百科是第二个来源。主要来源和官方文件是。废话,这正是发生在我身上的事!再来一个。。哈哈