Out of memory: Kill process 11598 (java) score 2 or sacrifice child 服务器故障处理

1、今天上午,突然收到反馈,说有一个服务器SSH远程不上了,让我处理一下,经我查询,这是一台物理服务器,具体业务用途不方便说。

2、排查过程如下

3、先尝试ssh远程故障服务器,发现确实是远程不了,使用telnet测试SSH的端口,也是不通的

4、然后使用ping检测故障服务器网络是否可达,发现可以ping通

5、随后使用BMC登录此物理服务器,进行查看 

发现硬件没有告警,然后登录此服务器远程虚拟控制台

当前系统界面显示 

Out of memory: Kill process 11598 (java) score 2 or sacrifice child

此为系统内存溢出,解决方法是系统重启

6、先恢复业务,再排查日志,跟上级管理员报备后,立即执行重启操作

7、系统重启恢复正常后,查看系统硬件日志

硬件日志文件位置:/var/log/dmesg

将日志文件拉取到本地电脑进行分析

通过分析服务器硬件日志发现,今天上午服务器系统内存错误,触发了系统机制来kill掉Java程序

服务器硬件是没有问题的,现在需要考虑的是java程序的内存管理问题了

Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(GarbageCollection,GC)完成的,程序员不需要通过调用GC函数来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是中断式执行GC。但GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间。

再通过和业务人员沟通,了解到,这是用于跑数据处理的脚本,经常多人在线操作

所以结论最终为:内存中加载的数据量过于庞大,如java程序一次从数据库取出过多数据,并且使用完后未清空cache内存,使得JVM不能回收,内存无法释放,进而内存空间不足,内存溢出。

解决方案:

方案1:经常关注服务器的cache缓存内存,手动及时清理内存,

方案2:修改JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的内存为64M,Tomcat默认可以使用的内存为128MB,对于稍复杂一点的系统就会不够用。在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。因此,-Xms,-Xmx参数一定不要忘记加。

猜你喜欢

转载自blog.csdn.net/wxqndm/article/details/127730510