2016-06-07 109 views
0

我的java桌面應用程序(使用netbean開發)在運行很長時間(大約10個小時)時處於掛起狀態。當JAVA桌面應用程序掛起時應該怎麼做?

我的應用程序的目的是將SOAP Web服務調用到企業系統。 所以,執行總是需要很長時間。

但是在第一個1-4小時內,它工作得很好。

運行10小時以上時總會出現此問題。

下面我已經完成了一些步驟。

  1. 使用log4j記錄所有異常消息。 (因爲我認爲它可能會導致網絡連接,數據庫連接等)。

  2. 每次都在循環語句中調用System.gc()(因爲我認爲它運行很長時間,它不會釋放資源回到系統,所以我強制它調用垃圾回收器)。

我曾嘗試和測試,在任何情況下該異常可偏偏如

  1. 網絡連接斷開。
  2. 連接超時。
  3. 企業發回消息爲500內部錯誤(以及所有http錯誤)
  4. SOAP消息的XML格式無效。
  5. 解析XML時失敗
  6. 與數據庫的連接無法建立。
  7. 無效的SQL語句。
  8. 數據庫中字段的數據類型無效。

每個異常都會被log4j捕獲並能夠繼續運行。

但是,這在第1 - 4小時內運作良好。達到10小時時。它被吊死了。沒有日誌。沒有信息。

我用JAVA JDK 1.8,MySQL數據庫5.5.4,Windows服務器2008 R2 64位

能否請您幫忙建議我缺少的是什麼斑或點?

還有什麼我應該關心和檢查的?

最好的問候,

+0

你分配你的Java應用程序有多少內存?內存使用量會隨着時間增加嗎?嘗試設置更高或更低的XMX並查看它是否會影響崩潰需要多長時間。如果發生這種情況,那麼你將有一個地方開始,並可以運行在你可能綁定資源的情況下。 – sorifiend

+0

@sorifiend此應用程序的內存分配大約3GB。 我在任務管理器中監視並查看javaw.exe進程(我的應用程序)只消耗〜170 MB。 :( –

回答

0

簡單的答案:DEBUG,添加大量的日誌/調試。

只使用使用log4j的檢查錯誤,但您的應用程序顯然是其他地方掛的log4j有機會做一個日誌之前,所以不是我建議你做的兩件事情之一:

1)創建一個檢查應用程序狀態的新線程(您顯然需要將部分代碼暴露給該線程並定期檢查它)。

2)更簡單的選擇是添加大量的調試代碼以將所有內容記錄到文件中,然後當應用程序掛起時,通過檢查日誌文件很容易看出最後一個操作是什麼,並且可能確切地知道是什麼引起了這個問題因此,個人而言,只是記錄錯誤,我會在處理以下任何內容之前創建一個日誌:傳入連接,超時,調用數據庫,http錯誤以及幾乎任何其他重大事件,並且我還會在所有以下已被處理。這樣當應用程序掛起時,只需查找尚未完成的任何進程,然後通過添加更多調試/日誌記錄就可以開始調查爲什麼會發生這種情況。

一旦你解決了問題,別忘了提煉或刪除所有的調試代碼,否則你可能會遭受一些性能損失,除非你在不同的線程中完成。

相關問題