Linux中:Out of memory: Kill process 29650 (java) score 174 or sacrifice child

Posted laiwenhuajava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中:Out of memory: Kill process 29650 (java) score 174 or sacrifice child相关的知识,希望对你有一定的参考价值。

Linux有一个特性

Linux有一个特性:OOM Killer,一个保护机制,用于避免在​内存​不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。

dmesg | grep java
 Out of memory: Kill process 29650 (java) score 174 or sacrifice child
[105744155.799430] Killed process 29650 (java) total-vm:5983924kB, anon-rss:1436948kB, file-rss:0kB, shmem-rss:0kB

​linux​​下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit。这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用的,当你使用的时候说不定系统已经回收了一些资源了。不幸的是,当你用到这个Overcommit给你的内存的时候,系统还没有资源的话,OOM killer就跳出来了。

原因分析

​内存​​不足,自动查杀了进程,即杀死了项目进程,项目不能启动

这个问题的原因是low memory耗尽。“内核使用low memory来跟踪所有的内存分配,一旦low memory耗尽,就会查杀进程,以保持系统的正常运转。说白了 OOM Killer 就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉

当然,如果触发了OOM机制,系统会杀掉某些进程,那么什么进程会被处理掉呢?kernel提供给用户态的/proc下的一些参数:
1./proc/[pid]/oom_adj,该pid进程被oom killer杀掉的权重,介于 [-17,15](具体具体权重的范围需要查看内核确认)之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。

通过2个步骤可以确认,具体权重的范围:

①uname -a查看Linux内核版本

②进入/usr/src/kernels/内核版本/include/linux/oom.h确认具体的权重范围

 

2./proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算(2ⁿ,n就是oom_adj的值)后的结果。

oom_adj,oom_score是oom_killer的主要参考值

 

 解决方案(我们能做什么):

1.保护我们重要的进程,避免被处理掉实例:

(获得重要进程的PID)

ps -ef|grep java

(输入-17,禁止被OOM机制处理)

echo -17 > /proc/PID/oom_score_adj

2.关闭OOM机制(不推荐,如果不启动OOM机制,内存使用过大,会让系统产生很多异常数据)echo "vm.panic_on_oom=1" >> /etc/sysctl.confsystcl -p 

vm.panic_on_oom    默认为0开启    为1时表示关闭此功能

等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程。

当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉。

以上是关于Linux中:Out of memory: Kill process 29650 (java) score 174 or sacrifice child的主要内容,如果未能解决你的问题,请参考以下文章

ORA-27102:out of memory Linux-x86_64 Error: 12: Cannot allocate memory

ORA-27102:out of memory Linux-x86_64 Error: 12: Cannot allocate memory

ORA-27102:out of memory Linux-x86_64 Error: 12: Cannot allocate memory

Linux中:Out of memory: Kill process 29650 (java) score 174 or sacrifice child

Linux 的 Out-of-Memory (OOM) Killer

Out of memory: Kill process 解决