【问题标题】:What is 'JNI Global reference'什么是“JNI 全球参考”
【发布时间】:2010-09-11 20:58:03
【问题描述】:

我正在使用 jProfiler 来查找 Java swing 应用程序中的内存泄漏。我发现了一个不断增长的 JFrame 实例。

此框架打开,然后关闭。

使用 jProfiler 并查看 GC Root 的路径,只有一个引用,“JNI 全局引用”。

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

【问题讨论】:

    标签: java swing jprofiler


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果代码只有Java,这是最可能的解释。我在使用全局指针时遇到了问题,但我一直在使用 JNI。
    【解决方案2】:

    维基百科对Java Native Interface 有很好的概述,本质上它允许Java 和用其他语言编写的本机操作系统库之间进行通信。

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 废话,这正是我刚刚发生的事情!
    • 这里还有一个..哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2012-11-28
    相关资源
    最近更新 更多