oom引起java 进程被oom killer进程kill掉
1.现象
服务器,java进程不存在。
2.原因
操作系统内存不足,oom killer进程将java进程自动杀死。
3.排查过程
1.服务器信息
物理内存8G,java启动参数为:JAVA_OPTS=" -server -Xmx6g -Xms6g -Xss256k -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=256M -XX:+UseG1GC ,除java进程外还有filebeat、facon等进程
那么判断进程被干掉的原因如下:
(1)机器重启了
通过uptime看机器并未重启
(2)程序存在问题
通过查询程序的error log,并未发现异常
(3)被其他进程kill
2.排查信息
cat /var/log/messages或者dmesg | grep oom-killer,打开操作系统日志发现,以下内容
发现是java进程申请内存的时候,而物理内存已经不足,同时系统禁用了申请swap区内存,无内存资源可用的情况下,java进程触发了oom killer,导致操作系统kill掉进程
每列的含义为:
pid进程ID。
uid用户ID。
tgid线程组ID。
total_vm虚拟内存使用(单位为4 kB内存页)
rss程序实际使用物理内存(单位4 kB内存页)
nr_ptes页表项
swapents交换条目
oom_score_adj通常为0;较低的数字表示当调用OOM杀手时,进程将不太可能死亡。
通过计算得到如下结果:
18923(java)进程占用的内存页数量1742434,anon-rss:6969000kB为实际使用的物理内存,约7G
累计所有进程rss内存,1955619*4096=8G,swap禁用,很明显无内存可申请,故产生内存溢出
3.解决方案
1,限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
2,发现系统没有开启swap,给系统加了8G的swap空间