问题现象
线上有一个系统每天都会挂掉一次
问题分析处理过程
1.查看linux日志
命令:dmesg | grep oom-killer
命令:dmesg | grep java
因为 oom, 导致 linux 将 Java 进程 kill 掉了。
命令:free
swap作用:当内存不够用时,系统将内存中不常用的数据写入到swap中,下次在使用时,就从swap读取。swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。
结论: Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
2.查看 java dump日志
以下是我们程序的java命令:
我们可以在 /home/admin/logs 目录下,拉取dump日志进行分析
发现有个大对象占用内存99%,经过对象值分析定位到一个定时任务代码,每天凌晨会进行批量数据状态更新。
3.问题修改
将任务拆分批量拉取数据处理,同时因为数据量较大,单线程占用时间较长,业务状态延迟更新。进一步采取分布式任务,多实例拉取数据分片处理。
参考: www.shuzhiduo.com/A/kPzOy9Yx5… www.shuzhiduo.com/A/GBJrKjxW5… my.oschina.net/u/4313749/b…