如何解決JVM OutOfMemoryError內存泄漏問題?

沒有任何神奇的工具能夠爲您修復OutOfMemoryError,可是下面有一些選項能夠幫助您自動排除故障並肯定根本緣由。按照如下三個步驟來處理此JVM內存錯誤並開始恢復:sql

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

1、捕獲堆轉儲

堆轉儲是在指定時間點J內ava程序內存中的內容的快照。它包含有關存儲器中存在的對象的詳細信息,這些對象中存在的實際數據,這些對象如何維護到其餘對象以及其餘信息。堆轉儲是修復OutOfMemoryError的重要步驟,但它們確實存在一些挑戰,由於它們的內容可能難以閱讀和解密。架構

在最佳狀況下,您但願在OutOfMemoryError以前或以前捕獲堆轉儲以診斷緣由,但這並不容易。可是,您能夠自動執行此堆轉儲過程。經過使用如下變量編輯JRE的啓動參數,告訴JVM建立堆轉儲:併發

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

2、從新啓動麻煩的應用程序

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

您也能夠自動執行此重啓過程。只需編寫一個「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以及相似相似的其餘使人討厭的異常。spa

寫在最後

最後,歡迎作Java的工程師朋友們加入Java高級架構進階Qqun:963944895

羣內有技術大咖指點難題,還提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

比你優秀的對手在學習,你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰, 咱們必須不斷學習,不然咱們將被學習者超越!

趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索