2010-12-03 31 views
1

我希望我的問題有更多的背景,但不幸的是,我在絕望中發佈了這個問題。我無法用較小的應用程序來重現這一點,因爲我希望我可以在這裏發佈它。不幸的是,我所能做的就是試着解釋我的症狀,並希望有人看到類似的東西。JPanel由JNI舉辦引起OOM例外的全球參考

我有一個純粹的java應用程序,這是在某些客戶機上獲取OutOfMemoryExceptions。我提供了400MB的Java堆空間,但不幸的是,我們仍然看到這個問題。在應用程序崩潰之前從應用程序中抓取堆轉儲,我可以看到存在異常多的JPanel對象。看堆轉儲,有趣的是我的面板的傳入引用是「JNI全局引用」。有什麼令我困惑的是,爲什麼首先會有一個JPanel的全局引用?我只有一個框架。在什麼情況下,java需要創建一個JPanel的全局JNI引用?

雖然我有一個理論,它不基於我讀過的任何東西,但我覺得終結者線程被阻止。不幸的是,我沒有線程轉儲來證明這一點。我的理論是,我的jpanel排隊等待垃圾收集,但是,一旦它進入隊列,隊列本身就無法處理它。

有沒有人願意分享他們的理論或直覺?由於我無法在我的機器上重現這一點,所以在分析這個理論方面我有點hand hand。但是如果有人願意再給我一個調查路線,我將不勝感激。編輯: 我對此有一個小的更新。我的應用程序也使用拖放和分析堆轉儲一些,我注意到有儘可能多的java.awt.datatransfer.Transferable對象(它通過我的JPanel作爲可轉讓的一部分),因爲有JPanels沒有被清理乾淨了。有趣的是,對Transferable對象的唯一引用是JNI Global。它讓我懷疑終結器是否在清理JPanel時沒有被阻塞,但是在清理拖放可移動對象時。

編輯: 所以如果有人有興趣,我相信我已經確定了這個問題。因此,我在原始文章中遺漏的東西是應用程序嵌入使用Windows IE COM庫(使用一些第三方庫)的HTML頁面。無論如何,事實證明,無論是第三方庫還是IE COM庫本身都會在拖放時發生JNI全局引用。不幸的是,我沒有解決這個問題的工作,但是我想感謝所有那些在調查這個問題時給我提出建議的人。

回答