2012-04-23 79 views
2

我有一個Java Swing應用程序,它訂閱許多數據並以各種方式顯示這些數據。在負載很重的情況下,我遇到了JRE停止工作,消息「Java(TM)Platform SE binary已停止工作」。這顯然會關閉我的應用程序,我需要重新啓動它。我試圖谷歌的方式來解決這個問題,因爲我沒有在我的代碼或任何可以與我合作的堆棧跟蹤,但除了升級/重新安裝JRE和運行病毒掃描之外,我發現很少有用的信息。我已經完成了這兩項措施並重新啓動了服務器,但問題仍然存在。我試圖用Java VisualVM監視進程(請參閱下面的dump),但我並不是這個工具的專家,可能不知道要尋找什麼。我所做的觀察是,'崩潰'似乎與垃圾收集一致。Java SE二進制崩潰

該問題很容易重現,並在運行應用程序約10分鐘後發生。我不會運行具有任何特定jvm參數的應用程序。 Java版本是1.6.0_31(升級前爲_25),我在Windows 7 64位上運行。

在從下面的VisualVM的PIC Java二進制剛剛停止工作,這似乎與GC運行一致。 Dump from Java VisualVM

任何幫助或想法,以便我可以排除故障或解決問題,非常感謝。謝謝。

+0

你使用任何JNI擴展? – 2012-04-23 17:59:39

+0

看來GC沒有正常發生。 – kosa 2012-04-23 18:00:35

+0

@DmitryOvsyanko編號 – hgus1294 2012-04-23 18:01:12

回答

2

垃圾收集暫停虛擬機的應用程序線程,而碰巧的是,這可能是某個地方露出了競爭條件。

+0

好的。有關如何解決這個問題的任何想法? – hgus1294 2012-04-23 18:05:07

+0

參見關於EDT違規的[* ThreadCheckingRepaintManager *](http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html)。 – trashgod 2012-04-23 20:59:28

3

三件事來檢查:

  1. 如果你已經實現了finalize()方法在任何地方,確保它不會直接或間接地鎖定任何物品;這可能導致與GC相關的蒼白性死鎖。

  2. 如果你有本地代碼,如果代碼沒有正確使用全局引用,包括死鎖和怪異的內存損壞,這又會與GC活動相關聯,任何數量的奇怪事情都可能發生。

  3. 最後,GC可能只是「攪拌鍋」和揭露,否則存在於應用程序香草死鎖;檢查你的同步協議。

+0

是那個消息 - 二進制已停止工作 - 總是死鎖? – 2012-04-23 18:05:08

+1

它可能是死鎖,或JVM,Windows或本機庫中的錯誤。他嘗試了兩種不同的Java修補程序級別,因此JVM錯誤不太可能發生,並且他沒有根據評論使用本機代碼。所以它最容易受到Windows bug(即JVM使用的某個Windows DLL中的錯誤)或者是死鎖。 – 2012-04-23 18:11:42

+0

謝謝。我會檢查1 + 3,因爲他們可能是潛在的候選人。我只希望自己能夠獲得更多有關它破壞的信息,因爲在有問題的負載的調試模式下運行應用程序會很麻煩和困難。 – hgus1294 2012-04-23 18:14:33