GC overhead limt exceed 致使的java進程假死

1.現象

線上後臺任務的java進程處於假死狀態java

2.排查過程

1.查看假死的進程ID
ps -ef | grep sku

2.將該進程的全部線程信息打印輸出至指定文件
jstack -F 8843 >> jstack-8843.log
3.查看該日誌文件前500行的信息
head -n 500 jstack-8843.log

No deadlocks found,表明沒有發現死鎖,全部的線程都處於BLOCKED狀態併發

4.查看GC的狀況,每隔2s打印一次,一共打印20次
jstat -gc 8843 2000 20

發現gc的次數在瘋狂增加,其次在該進程業務日誌中發現java.lang.OutOfMemoryError: GC overhead limit exceeded線程

GC overhead limt exceed檢查是Hotspot VM 1.6定義的一個策略,經過統計GC時間來預測是否要OOM了,提早拋出異常,防止OOM發生。Sun 官方對此的定義是:「並行/併發回收器在GC回收時間過長時會拋出OutOfMemroyError。過長的定義是,超過98%的時間用來作GC而且回收了不到2%的堆內存。用來避免內存太小形成應用不能正常工做。「3d

3.結論

基本能夠判斷爲程序的內存設置太小,致使頻繁GC,引發假死,調整 -Xms -Xmx 便可日誌

相關文章
相關標籤/搜索