簡體   English   中英

JNI全局引用持有的JPanel導致OOM異常

[英]JPanel held by JNI Global reference causing OOM Exceptions

我希望我對這個問題有更多的了解,但是不幸的是,我出於絕望地發布了這個問題。 我無法使用較小的應用程序重現此內容,因為我希望可以在此處發布。 不幸的是,我所能做的就是嘗試解釋我的症狀,並希望外面有人看到過類似的東西。

我有一個純Java應用程序,它在某些客戶端計算機上會出現OutOfMemoryExceptions。 我提供了400mb的Java堆空間,但是不幸的是,我們仍然看到這個問題。 在崩潰之前從我的應用程序中獲取堆轉儲,我可以看到有異常多的JPanel對象。 查看堆轉儲,有趣的是,面板的唯一傳入引用是“ JNI全局引用”。 讓我感到困惑的是,為什么首先會有JNI全局引用JPanel? 我只有一個框架。 在什么情況下,java需要創建對JPanel的全局JNI引用?

盡管我有一個理論,但它並不是基於我所讀的任何東西,但是我感覺到終結器線程被阻塞了。 不幸的是,我沒有線程轉儲來證明這一點。 我的理論是,我的jpanel被排入隊列以進行垃圾收集,但是,一旦它進入隊列,隊列本身就無法處理它。

有沒有人願意分享他們的理論或內心的直覺? 由於我無法在計算機上重現此信息,因此在分析此理論時我有些束手無策。 但是,如果有人願意給我另一條調查路線,我將不勝感激。

編輯:我對此有一個小更新。 我的應用程序還使用了拖放操作,並進一步分析了堆轉儲,我注意到有許多java.awt.datatransfer.Transferable對象(將我的JPanel傳遞為transferable的一部分),因為有些JPanels並沒有被清理了。 有趣的是,對Transferable對象的唯一引用還是JNI Global。 這讓我想知道終結器是否在清理JPanels時不會被阻塞,而在清理拖放式可移動對象時是否被阻塞。

編輯:因此,如果有人感興趣,我相信我已經確定了問題。 因此,我在原始文章中遺漏的是應用程序使用Windows IE COM庫(使用某些第三方庫)嵌入HTML頁面。 無論如何,事實證明,在發生拖放時,第三方庫或IE COM庫本身都將獲取JNI全局引用。 不幸的是,我沒有解決此問題的方法,但是我想感謝所有在調查此問題時向我發送建議的人員。

假設Java本機接口代碼不是您自己的,則可能需要dispose()一個錯誤的圖形上下文( 如果它是直接從組件或另一個Graphics對象創建的)。 這個RotatableImage是一個示例,如果沒有dispose() ,它將泄漏。

暫無
暫無

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

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