问题:
程序在linxu服务器运行的好好的,收到线上告警服务离线,登录linux服务器查看,发现服务进程已经终止。
排查过程:
1.思考可能引起服务挂掉的原因
- java本身发生OOM,即日志中打印"java.lang.OutOfMemoryError: Java heap space"
- 被linxu操作系统执行OOM-Killer
2.首先查看服务器监控数据,发现该服务jvm内存使用正常,查看服务日志也没有发现打印OutOfMemoryError异常信息,可以排除此原因。
怀疑:有可能Java进程本身没有内存过高被杀,但是这个进程当时占用的内存过高,挤占了OS内核空间, 直接被操作系统触发OOM-Killer给杀死了
查看java进程数据
[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
查看被系统杀死的进程
[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
发现我的Java应用确实被 kill 了, 内存占用接近3G
确定发生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
结论:确实是因为内存占用过高导致被Linux杀死
解决方案:
1.调整jvm配置,官方建议是机器物理内存的60%。
2.增加物理机内存