如何解決JVM OutOfMemoryError記憶體洩漏問題?

banq發表於2019-06-15

沒有任何神奇的工具可以為您修復OutOfMemoryError,但是下面有一些選項可以幫助您自動排除故障並確定根本原因。按照以下三個步驟來處理此JVM記憶體錯誤並開始恢復:

  1. 捕獲JVM堆轉儲
  2. 重啟應用程式
  3. 診斷問題

1.捕獲堆轉儲

堆轉儲是在指定時間點J內ava程式記憶體中的內容的快照。它包含有關儲存器中存在的物件的詳細資訊,這些物件中存在的實際資料,這些物件如何維護到其他物件以及其他資訊。堆轉儲是修復OutOfMemoryError的重要步驟,但它們確實存在一些挑戰,因為它們的內容可能難以閱讀和解密。

在最佳情況下,您希望在OutOfMemoryError之前或之前捕獲堆轉儲以診斷原因,但這並不容易。但是,您可以自動執行此堆轉儲過程。通過使用以下變數編輯JRE的啟動引數,告訴JVM建立堆轉儲:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof

2.重新啟動麻煩的應用程式

大多數情況下,OutOfMemoryError不會使應用程式崩潰,但它可能會使應用程式處於不穩定狀態。在這種情況下重啟將是一種謹慎的舉動,因為不穩定的應用程式例項提供的請求會導致錯誤的結果。

您也可以自動執行此重啟過程。只需編寫一個“restart-myapp.sh”指令碼,它會重啟您的應用程式。向JVM提供命令列引數,以便在遇到異常時觸發它以執行以下指令碼:

-XX:OnOutOfMemoryError=/scripts/restart-myapp.sh

傳遞此引數時,只要丟擲OutOfMemoryError,JVM就會呼叫“/scripts/restart-myapp.sh”指令碼。因此,您的應用程式將在遇到OutOfMemoryError後立即自動重新啟動。

3.診斷問題

現在您已經捕獲了堆轉儲 - 這是解決問題所需 - 並重新啟動應用程式 - 以減少中斷影響 - 下一步是故障排除。

如上所述,理解堆轉儲的內容可能很棘手,但有一些有用的堆分析器工具可以幫助簡化流程。一些選項包括Eclipse Memory Analyzer(MAT),Oracle JHat或HeapHero

這些工具生成記憶體分析報告,突出顯示導致最大記憶體的物件,並希望幫助識別導致記憶體洩漏的物件。

當您的應用程式遇到執行時錯誤時,這會非常令人沮喪。您需要耐心,記憶體堆轉儲以及分析問題的適當工具來修復OutOfMemoryError以及類似類似的其他令人討厭的異常。

 

相關文章