起因
个人服务器上部署的两个java项目总是莫名其妙的挂掉,但是没有任何异常日志输出,百思不得其解。
寻因
首先,写了一个重启脚本,监测java进程,如果挂了就自动重启。这个方法治标不治本,只能说尽量保证服务是可用的。
观察了几天重启脚本的日志,发现一个奇怪的现象,程序在每天下午3点52分固定时间挂掉。难不成不是java程序本身的问题?
因为就算是java内存溢出或者啥的问题,也不至于说每天固定时间挂掉。
过了几天,了解到linux查看系统日志的办法,在/var/log/messages文件中,可以看到所有的系统日志。通过日志发现,在下午15点52分,有如下日志:
May 17 15:52:50 VM-8-16-centos kernel: Out of memory: Kill process 2908 (java) score 97 or sacrifice child
May 17 15:52:50 VM-8-16-centos kernel: Killed process 2908 (java), UID 0, total-vm:3185724kB, anon-rss:378476kB, file-rss:384kB, shmem-rss:0kB
May 17 15:52:51 VM-8-16-centos systemd-logind: Removed session 24481.
May 17 15:53:02 VM-8-16-centos systemd: Started Session 24637 of user root.
执行命令grep "Out of memory" /var/log/messages
May 18 15:52:31 VM-8-16-centos kernel: Out of memory: Kill process 10147 (java) score 179 or sacrifice child
May 18 15:52:55 VM-8-16-centos kernel: Out of memory: Kill process 15334 (java) score 95 or sacrifice child
May 19 15:52:26 VM-8-16-centos kernel: Out of memory: Kill process 26163 (java) score 177 or sacrifice child
May 19 15:52:26 VM-8-16-centos kernel: Out of memory: Kill process 26169 (G1 Young RemSet) score 179 or sacrifice child
May 19 15:52:26 VM-8-16-centos kernel: Out of memory: Kill process 26178 (VM Periodic Tas) score 179 or sacrifice child
May 19 15:52:26 VM-8-16-centos kernel: Out of memory: Kill process 26272 (Catalina-utilit) score 179 or sacrifice child
May 19 15:52:46 VM-8-16-centos kernel: Out of memory: Kill process 24130 (java) score 88 or sacrifice child
原来是在这时候,系统发生了OOM,为什么OOM会杀掉我的java程序呢?
询问GPT得知如下信息:
从提供的日志中可以分析出以下关键信息和可能的解决步骤:
关键信息:
内存不足警告:日志中显示“Out of memory: Kill process 4847 (SimplePauseDete) score 186 or sacrifice child”,这表示系统内存不足,操作系统选择终止进程以释放内存。
内存不足管理:日志中的“oom-killer”和相关的堆栈跟踪显示内存分配失败,系统试图通过杀死占用内存最大的进程来回收内存。
内存分配细节:日志还提供了内存区域的详细分配情况,包括DMA, DMA32和Normal区域的内存使用情况。
交换空间:日志指出“Free swap = 0kB”和“Total swap = 0kB”,表明系统没有配置交换空间或交换空间已被完全用尽。
原来当系统OOM时,操作系统会尝试杀死内存最大的进程来回收内存。(java程序可不就是吃内存大户么)
到这里,知道是操作系统OOM导致java程序挂掉了。那为什么这个点操作系统会OOM呢?
突然想到,我在青龙面板里有很多定时任务,是不是这会有大量定时任务在跑呢?
查看青龙面板发现,的确在15:52分有将近30个脚本在同一时间跑。而且这些脚本都是耗时比较长,占用系统资源比较多的。看来是这个造成了系统OOM。
把脚本停止后,就没有OOM发生了。
总结
程序的OOM也不一定是程序本身的问题,可能是系统OOM导致程序挂掉。
需要学习如何查看系统日志来解决问题的办法
定时任务同一时间不能跑太多,不然会占用大量系统资源。