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

世事洞明皆学问,人情练达即文章。这篇文章主要讲述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确认具体的权重范围
 
【Linux中(Out of memory: Kill process 29650 (java) score 174 or sacrifice child)】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掉。

    推荐阅读