概述
有時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
