故障排查:java应用启动后进程自动被杀

java项目部署以后,过一段时间发现进程已不存在,

启动java项目命令如下,启动日志写入当前目录下的nohup.out文件:

# nohup java -jar server-0.0.1-SNAPSHOT.jar & 

[6] 118424 

# nohup: ignoring input and appending output to ‘nohup.out’

查看进程存在:

# ps -ef |grep server-0.0.1-SNAPSHOT.jar

root      118424   1  1 15:20 pts/1    00:00:56 java -jar /data/workspace/server-0.0.1-SNAPSHOT.jar

查看项目占用的端口是否正常在监听:

# netstat -tulnp|grep 8084 

tcp6 0 0 :::8084 :::* LISTEN 118424/java 

一段时间后进程不存在了,查看项目日志未发现报错或异常;

于是,查看系统日志:

# tail -f /var/log/messages

Mar  1 15:14:08 s6 kernel: [124232]    0 124232    28177      61      12        0            0 grep

Mar  1 15:14:08 s6 kernel: Out of memory: Kill process 118430 (java) score 78 or sacrifice child

Mar  1 15:14:08 s6 kernel: Killed process 118430 (java) total-vm:5745276kB, anon-rss:978344kB, file-rss:1140kB, shmem-rss:0kB

Mar  1 15:17:12 s6 clamd[12450]: SelfCheck: Database status OK.

发现是因为内存溢出!

于是手动杀掉暂时未使用的进程,比如微服务的应用,是服务器内存空闲出一部分,重新启动server-0.0.1-SNAPSHOT.jar应用,恢复正常,进程没有再自动挂掉了。

理论解释:

        操作系统(operating system)构建在进程(process)的基础上, 进程由内核作业(kernel jobs)进行调度和维护,其中有一个内核作业称为 “Out of memory killer(OOM终结者)”,Out of memory killer 在可用内存极低的情况下会杀死某些进程。只要达到触发条件就会激活,选中某个进程并杀掉。 通常采用启发式算法,对所有进程计算评分(heuristics scoring),得分最低的进程将被 kill 掉。 Out of memory: Kill process or sacrifice child 既不由JVM触发,也不由JVM代理,而是系统内核内置的一种安全保护措施。如果可用内存(含swap)不足, 就有可能会影响系统稳定,这时候 Out of memory killer 就会设法找出流氓进程并杀死他,也就是引起 Out of memory: kill process or sacrifice child 错误。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 7,600评论 0 3
  • ANR问题,相信是每位开发日常都会遇到的问题,对于这类问题的分析,按照官方的推荐,或网络博客的总结思路能解决一定的...
    tiger桂阅读 18,104评论 5 28
  • 特种兵,听起来多么酷。迪姐姐小时候就想当一名军人,后来没实现,就想当一名军嫂,又没实现,现在目标改了,当军...
    迪爷是微商阅读 3,564评论 0 0
  • 花了一下午,看完了刁亦男的四部相关作品,他参与编剧的《洗澡》、《爱情麻辣烫》和他自编自导的《制服》、《夜车...
    夏天的小南阅读 3,860评论 0 3
  • 不知道杭州会发生什么 心里隐隐的害怕
    贺琳阅读 1,657评论 1 1