簡體   English   中英

什么是'JNI全球參考'

[英]What is 'JNI Global reference'

我正在使用jProfiler在Java swing應用程序中查找內存泄漏。 我已經確定了JFrame的實例,它在數量上不斷增長。

此框架打開,然后關閉。

使用jProfiler,並查看GC根路徑,只有一個參考,'JNI全局參考'。

這是什么意思? 為什么它掛在框架的每個實例上?

JNI全局引用是從“本機”代碼到Java垃圾收集器管理的Java對象的引用。 其目的是防止收集仍由本機代碼使用的對象,但似乎在Java代碼中沒有任何實時引用。

JFrame是java.awt.Window ,與“本機”Window對象相關聯。 完成特定JFrame實例后,應調用其dispose()方法進行清理。

我不確定是否有任何本機代碼正在創建對JFrame的全局引用,但似乎很可能。 如果是這樣,這將阻止JFrame被垃圾收集。 如果要創建許多Windows(或子類)並且看到它們從未被收集過,請確保它們已被丟棄。

在修復JavaFX應用程序中的內存泄漏時,我遇到了這個問題。 最后問題結果是我在調試模式下運行應用程序並在代碼中有幾個斷點。 這似乎導致對象成為“JNI全局引用”並且沒有明顯原因保存在內存中。 當我關閉調試模式時,一切正常!

Wikipedia對Java Native Interface有一個很好的概述,實質上它允許Java和用其他語言編寫的本機操作系統庫之間的通信。

JNI全局引用容易出現內存泄漏,因為它們不會自動進行垃圾回收,程序員必須明確釋放它們。 如果您沒有自己編寫任何JNI代碼,則您使用的庫可能存在內存泄漏。

編輯 這里是關於本地和全局引用的更多信息,以及為什么使用全局引用(以及它們應該如何被釋放)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM