赞
踩
软件在运行时显示 进程被杀死,首先通过命令查看被杀死的进程的情况
dmesg | egrep -i -B100 'killed process'
显示,在被杀死的时候该进程占用的内存
[22588.717326] Killed process 8163 (XXX进程)
total-vm:5 826 324kB,
anon-rss:5 454 392kB,
file-rss:4kB,
shmem-rss:0kB
进程号:8163
total-vm:total virtual memory. 进程使用的总的虚拟内存
rss
: resident set size. 驻留集大小。驻留集是指进程已装入内存的页面的集合。
anon-rss:anonymous rss. 匿名驻留集。比如malloc出来的就是匿名的。
可以看到该进程占用内存过大,达到了5G多,被杀死的原因是 outofmemory,debug定位到具体的函数,最后发现是一个链表没有被回收,在一个循环中不断的被追加,导致内存溢出。
Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。
查看系统日志同样可以查看被杀死进程的状态。
egrep -i -r 'killed process' /var/log
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。