记一次java服务突然被挂掉问题排查

721 阅读1分钟

问题现象

线上有一个系统每天都会挂掉一次

问题分析处理过程

1.查看linux日志

命令:dmesg | grep oom-killer

image.png

命令:dmesg | grep java image.png

因为 oom, 导致 linux 将 Java 进程 kill 掉了。

命令:free image.png

swap作用:当内存不够用时,系统将内存中不常用的数据写入到swap中,下次在使用时,就从swap读取。swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。

结论: Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。

2.查看 java dump日志

以下是我们程序的java命令:

image.png

我们可以在 /home/admin/logs 目录下,拉取dump日志进行分析

发现有个大对象占用内存99%,经过对象值分析定位到一个定时任务代码,每天凌晨会进行批量数据状态更新。

3.问题修改

将任务拆分批量拉取数据处理,同时因为数据量较大,单线程占用时间较长,业务状态延迟更新。进一步采取分布式任务,多实例拉取数据分片处理。

参考: www.shuzhiduo.com/A/kPzOy9Yx5… www.shuzhiduo.com/A/GBJrKjxW5… my.oschina.net/u/4313749/b…