天天看點

項目中排查Jvm問題

對于還在正常運作的系統:

1.可以使用jmap來檢視jvm中各個區域中的使用情況。

2.可以通過使用jstack來檢視線程的運作情況,比如哪些線程阻塞、是否出現了死鎖。

3.可以通過jstat指令來檢視垃圾回收的情況,特别是fullgc,如果發現fullgc比較頻繁,那麼就得進行調優了。

4.通過各個指令的結果,或者jvisualvm等工具來進行分析。

5.首先,初步猜測頻繁進行fullgc的原因,如果頻繁發生fullgc,但是又一直沒有出現記憶體溢出,那麼表示fullgc實際上是回收了很多對象,是以這些對象最好能在yonggc過程中直接回收掉,避免這些對象進去老對象。對于這種情況,就要考慮這些存活時間不長的對象是不是比較大,導緻年輕代放不小,直接進入了老年代,嘗試加大年輕代的大小,如果改完之後,fullgc減少,則證明修改有效。

6.同時,還可以找到占用cpu最多的線程,定位到具體的方法,優化這個方法的執行,看下是否避免某些對象的建立,進而節省記憶體。

對于已經發生OOM的系統:

1.一般生産系統中都會設定當系統發生OOM時,生成當時的dump檔案(-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs)

2.可以利用jvisualvm等工具來分析dump檔案

3.根據dump檔案找到異常的執行個體對象,和異常的線程(占用cpu高),定位到具體的代碼。

繼續閱讀