診斷 Java.lang.OutOfMemoryError(OOM)

在跟蹤性能問題時,堆內存是首先應該被監控的最重要的組件之一。一旦堆內存的實際使用量超過其所容許的堆空間,就會產生堆內存壓力。而這將致使頻繁的全面垃圾回收事件,垃圾回收將竊取CPU週期,輕則致使響應時間延遲,重則致使必須從新啓動Java虛擬機才能解決的內存溢出錯誤。java


內存溢出錯誤(OOM)app


當我運行應用時,出現了以下異常:編輯器


java.lang.OutOfMemoryError: GC overhead limit exceeded[7,9]ide

java.lang.OutOfMemoryError: Java heap space工具


第一條信息意味着,出於某種緣由,垃圾收集器每次執行都花費了大量時間但只回收了不多量的內存,當我刪除了以下代碼後:性能


System.gc();spa


第一條信息消失了,取而代之的,系統出現了第二條信息。很明顯堆內存空間依然存在問題。下面是我調查問題的步驟:命令行


1. 添加下面的Java啓動參數3d


  • -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps日誌

        

  • 系統會生成gc.log文件


  • -XX:+HeapDumpOnOutOfMemoryError

        

  • 系統會生成堆內存轉儲文件


2. 分析日誌文件:


  • 使用常規的文本編輯器查看gc.log 文件。


  • 使用 Eclipse Memory Analyzer 查看 堆內存轉儲文件 (例如, java_xxx.hprof)


請注意,本文所討論的全部虛擬機參數都是基於Hotspot虛擬機的。


Java命令行參數說明:


  • -XX:+PrintGCDetails


  • 打印更多的關於垃圾收集的信息。


  • -XX:+PrintGCTimeStamps


  • 打印從HotSpot 虛擬機開始執行直至垃圾收集事件發生所花費的時間(以秒爲單位)。


  • -Xloggc:gc.log


  • 在每次垃圾收集時打印堆內存以及垃圾收集的信息。


在JDeveloper中能夠按照以下方式設定:


  1. 右鍵選擇你的項目(例如ViewController),顯示出菜單


  2. 選擇Project Properties…


  3. 選擇Run/Debug/Profile


  4. 選擇你Run Configuration(例如, Default)


  5. 點擊Edit按鈕


  6. 在Java虛擬機參數欄位設定 -Xloggc:gc.log -XX:-PrintGCDetails


圖片


運行你的應用並重現內存溢出異常,系統將會生成日誌文件gc.log,

個人是在以下目錄:


  • …/system11.1.1.5.37.60.13/DefaultDomain


由於個人Web應用是部署在集成的WLS中,而且經過DefaultDomain來執行。

因此,想要理解gc.log文件的格式,請參考關聯閱讀[5,15]。


不過,gc.log文件並不能真正的幫到咱們,由於他只是簡要的打印了堆內存問題,


但並無指出問題出在哪。

接下來我要作的是添加以下參數,並從新執行服務。


-XX:+HeapDumpOnOutOfMemoryError


當服務發生堆內存錯誤時,會生成java_pid30835.hprof文件。


 Eclise內存分析器(Eclipse Memory Analyzer)


堆內存轉儲文件由HPROF(堆內存和CPU分析工具)生成,堆內存轉儲文件是2進制格式的,所以必須使用Eclpse Memory Analyzer 來查看。


你能夠經過Eclipse Update manager 來安裝Eclipse MAT,選擇」General Purpose Tools 「並安裝」Memory Analyser (Incubation)」以及」Memory Analyser (Charts)」。


圖片


安裝以後,雙擊堆內存轉儲文件而且選擇」Leak Suspects Report」


圖片


Eclipse MAT會顯示以下圖表:



以及問題的嫌疑人:


圖片



調整堆內存空間


若是你觀察到垃圾收集日誌文件中有內存溢出錯誤,那麼能夠嘗試將Java堆內存空間調整爲你可以分配給Java虛擬機的物理內存空間的80%,基於具體是老年代空間仍是永久代空間發生內存溢出,你能夠像這樣調整內存空間。


  • 針對老年代發生內存溢出


  • increase -Xms and -Xmx


  • 針對永久代發生內存溢出


  • increase -XX:PermSize and -XX:MaxPermSize


參考文獻:


  1. Eclipse Update Manager


  2. Eclipse Memory Analyzer


  3. Java Hotspot VM Options


  4. Integrated WebLogic Server (WLS)


  5. Diagnosing a Garbage Collection problem


  6. Frequently Asked Questions about Garbage Collection


  7. GC Overhead Limit Exceeded


  8. HPROF: A Heap/CPU Profiling Tool in J2SE 5.0


  9. Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning


  10. Java Performance by Charlie Hunt and Binu John


  11. Understanding Garbage Collection


  12. Java HotSpot VM Options


  13. GCViewer (a free open source tool)


  14. Understanding Garbage Collector Output of Hotspot VM

相關文章
相關標籤/搜索