Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是';JNI全球参考';_Java_Swing_Jprofiler - Fatal编程技术网

Java 什么是';JNI全球参考';

Java 什么是';JNI全球参考';,java,swing,jprofiler,Java,Swing,Jprofiler,我正在使用jProfiler查找Java swing应用程序中的内存泄漏。我已经确定了一个JFrame的实例,它的数量在不断增长 此框架打开,然后关闭 使用jProfiler,并查看到GC根目录的路径,只有一个引用“JNI全局引用” 这是什么意思?为什么它会挂在框架的每个实例上?Wikipedia有一个很好的概述,本质上它允许Java和用其他语言编写的本机操作系统库之间的通信 JNI全局引用容易发生内存泄漏,因为它们不会被自动垃圾收集,程序员必须显式地释放它们。如果您自己没有编写任何JNI代码,

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

此框架打开,然后关闭

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


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

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

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


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

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

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


我不确定是否有任何本机代码正在创建对JFrame的全局引用,但这似乎是可能的。如果确实如此,这将防止JFrame被垃圾收集。如果您正在创建许多窗口(或子类),并且发现它们从未被收集,请确保它们已被释放。

我在修复JavaFX应用程序中的内存泄漏时遇到了这个问题。最后的问题是,我在调试模式下运行应用程序,代码中有几个断点。这似乎导致对象成为“JNI全局引用”,并毫无理由地保存在内存中。当我关闭调试模式时,一切正常

如果代码只是Java,这是最有可能的解释。我在全局指针方面遇到了一些问题,但我一直在使用JNI。维基百科是第二个来源。主要来源和官方文件是。废话,这正是发生在我身上的事!再来一个。。哈哈