問題:
程序在linxu服務(wù)器運行的好好的魂奥,收到線上告警服務(wù)離線终抽,登錄linux服務(wù)器查看蛛倦,發(fā)現(xiàn)服務(wù)進(jìn)程已經(jīng)終止。
排查過程:
1.思考可能引起服務(wù)掛掉的原因
- java本身發(fā)生OOM溯壶,即日志中打印"java.lang.OutOfMemoryError: Java heap space"
- 被linxu操作系統(tǒng)執(zhí)行OOM-Killer
2.首先查看服務(wù)器監(jiān)控數(shù)據(jù),發(fā)現(xiàn)該服務(wù)jvm內(nèi)存使用正常且改,查看服務(wù)日志也沒有發(fā)現(xiàn)打印OutOfMemoryError異常信息,可以排除此原因板驳。
懷疑:有可能Java進(jìn)程本身沒有內(nèi)存過高被殺,但是這個進(jìn)程當(dāng)時占用的內(nèi)存過高若治,擠占了OS內(nèi)核空間慨蓝, 直接被操作系統(tǒng)觸發(fā)OOM-Killer給殺死了
查看java進(jìn)程數(shù)據(jù)
[ticket@iZ2ze0uo1c6bfj8d9lck63Z log]$ dmesg | grep java
[50380153.821507] java invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
[50380153.821512] java cpuset=/ mems_allowed=0
[50380153.821516] CPU: 0 PID: 19176 Comm: java Tainted: G OE ------------ T 3.10.0-1062.1.2.el7.x86_64 #1
[50380153.821784] [ 5424] 1000 5424 876540 24047 156 0 0 java
[50380153.821792] [18875] 1000 18875 1280393 698641 1482 0 0 java
[50380153.821818] Out of memory: Kill process 18875 (java) score 750 or sacrifice child
[50380153.822757] Killed process 18875 (java), UID 1000, total-vm:5121572kB, anon-rss:2794564kB, file-rss:0kB, shmem-rss:0kB
查看被系統(tǒng)殺死的進(jìn)程
[ticket@iZ2ze0uo1c6bfj8d9lck63Z log]$ dmesg | egrep -i 'killed process'
[50380153.822757] Killed process 18875 (java), UID 1000, total-vm:5121572kB, anon-rss:2794564kB, file-rss:0kB, shmem-rss:0kB
發(fā)現(xiàn)我的Java應(yīng)用確實被 kill 了感混, 內(nèi)存占用接近3G
確定發(fā)生oom
[ticket@iZ2ze0uo1c6bfj8d9lck63Z log]$ dmesg -T | grep 'Out of memory'
[Wed Jul 20 16:58:23 2022] Out of memory: Kill process 18875 (java) score 750 or sacrifice child
結(jié)論:確實是因為內(nèi)存占用過高導(dǎo)致被Linux殺死
解決方案:
1.調(diào)整jvm配置,官方建議是機器物理內(nèi)存的60%菌仁。
2.增加物理機內(nèi)存