本文轉載自:http://blog.csdn.net/zhoutimo/article/details/52024487
What(什么是OOM):
Linux下面有個特性叫OOM killer(Out Of Memory killer),這個東西會在系統內存耗盡的情況下跳出來,選擇性的干掉一些進程以求釋放一些內存。具體的記錄日志是在/var/log/messages中,如果出現了Out of memory字樣,說明系統曾經出現過OOM!

When(什么時候出現):
linux下允許程序申請比系統可用內存更多的內存,這個特性叫Overcommit。這樣做是出於優化系統考慮,因為不是所有的程序申請了內存就立刻使用的,當你使用的時候說不定系統已經回收了一些資源了。不幸的是,當你用到這個Overcommit給你的內存的時候,系統還沒有資源的話,OOM killer就跳出來了。
參數/proc/sys/vm/overcommit_memory可以控制進程對內存過量使用的應對策略
1.當overcommit_memory=0 允許進程輕微過量使用內存,但對於大量過載請求則不允許,也就是當內存消耗過大就是觸發OOM killer。
2.當overcommit_memory=1 永遠允許進程overcommit,不會觸發OOM killer。
3.當overcommit_memory=2 永遠禁止overcommit,不會觸發OOM killer。
How(系統會怎么樣):
當然,如果觸發了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的主要參考值
