在跟蹤性能問題時,堆內存是首先應該被監控的最重要的組件之一。一旦堆內存的實際使用量超過其所容許的堆空間,就會產生堆內存壓力。而這將致使頻繁的全面垃圾回收事件,垃圾回收將竊取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中能夠按照以下方式設定:
右鍵選擇你的項目(例如ViewController),顯示出菜單
選擇Project Properties…
選擇Run/Debug/Profile
選擇你Run Configuration(例如, Default)
點擊Edit按鈕
在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
參考文獻:
Eclipse Update Manager
Eclipse Memory Analyzer
Java Hotspot VM Options
Integrated WebLogic Server (WLS)
Diagnosing a Garbage Collection problem
Frequently Asked Questions about Garbage Collection
GC Overhead Limit Exceeded
HPROF: A Heap/CPU Profiling Tool in J2SE 5.0
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
Java Performance by Charlie Hunt and Binu John
Understanding Garbage Collection
Java HotSpot VM Options
GCViewer (a free open source tool)
Understanding Garbage Collector Output of Hotspot VM