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空间

posted @ 2019-10-31 10:19  zbjice  阅读(4607)  评论(0)    收藏  举报