天天看點

排查線上環境 OOM 問題

概述

有時Java服務端上線後,運作一段時間後就會出現OOM 問題,這樣問題是非常嚴重的。

那要怎樣排查?怎樣解決?

工具安裝:

為什麼會要安裝工具?這是因為我們現在按照的open jdk 是預設沒有安裝jmap,jstatck,需要自行安裝。

以 Centos7 為例 介紹安裝過程

先使用 java -version 版本 号

OpenJDK Runtime Environment (build 1.8.0_322-b06)      

查詢 Jmap 與java 目前版本比對的版本

yum whatprovides '*/jmap'      

找到相應的版本安裝

yum install java-1.8.0-openjdk-devel-1.8.0.322.b06-1.el7_9.x86_64      

到此這樣工具就完成了。

回到正軌,問題出現怎樣排查問題

檢視服務的程序是否存在

ps -ef | grep 服務名 ps -aux | grep 服務名      

檢視服務的日志

cat -n xxx_log |grep "OutOfMemoryError"      
「java.lang.OutOfMemoryError GC overhead limit exceeded oracle      

官方給出的解釋如下:

大概意思就是說,JVM花費了98%的時間進行垃圾回收,而隻得到2%可用的記憶體,頻繁的進行記憶體回收(最起碼已經進行了5次連續的垃圾回收),JVM就會曝出ava.lang.OutOfMemoryError: GC overhead limit exceeded錯誤。

檢視堆記憶體占用概況

jmap -heap 程序号      

檢視堆中對象的統計資訊

jmap -histo 程序号 | head -n 100      

檢視GC統計資訊

jstat -gcutil 程序号      
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 100.00 99.94 90.56 87.86 875 9.307 3223 5313.139 5322.446
S0:幸存1區目前使用比例
S1:幸存2區目前使用比例
E:Eden Space(伊甸園)區使用比例
O:Old Gen(老年代)使用比例
M:中繼資料區使用比例
CCS:壓縮使用比例
YGC:年輕代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間      

生産對堆快照Heap dump

jmap -dump:format=b,file=/tmp/程序号_jmap_dump.hprof 程序号      

分析生成的堆快照

使用 Eclipse Memory Analyzer 工具。下載下傳位址:www.eclipse.org/mat/download

排查線上環境 OOM 問題
排查線上環境 OOM 問題