参考文档:https://www.jianshu.com/p/20adbfb8016f
1、当系统内存不足时OOM就会被触发
执行grep -i “kill” /var/log/messages* 如果打印如下信息,则说明程序被Linux OOM Killer杀掉了
kernel: Memory … out of memory: Kill process …
2、当系统内存不足时,out_of_memory()就会被触发
3、cat /proc/sys/vm/panic_on_oom
这个值为 0 表示在OOM时系统执行OOM Killer
这个值为 1 表示在OOM时系统会panic(恐慌)
# sysctl是临时生效
# /etc/sysctl.conf是永久生效
sysctl -w vm.panic_on_oom=1
sysctl -w kernel.panic=10 # 表示10s后重启
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=10” >> /etc/sysctl.conf
4、如果cat /proc/sys/vm/panic_on_oom设置为1,则当发生OOM 时,cat /proc/pid/oomscore值越大则越容易被杀掉(重启)注意:/proc/{pid}/oom_score就是计算进程使用的内存占"可用内存"的百分比
5、cat /proc/sys/vm/overcommit_memory,这个文件的值表示了Linux如何控制内存分配的行为.
这个值为 0(默认值), 表示系统允许Overcommit内存,但是有些限制. 这一般意味着kernel会基于空闲的swap空间、空闲的RAM内存和cache空间,这些空间可以随时被cleared.
这个值为 1, 表示kernel允许分配更多的内存(多余系统中已经存在的内存),而且不会抛出异常. malloc()操作总是返回true
这个值为 2, 表示kernel拒绝 >= 可用的swap和物理内存的某个百分比(overcommit_ratio,默认为50)的内存分配请求.
6、overcommit_ratio 可以请求内存的百分比
假设物理内存为4G,并且没有swap空间, 现在我们将 vm.overcommit_memory 设置为 2, 那么可以请求的内存就变为 4G50% = 2G .
然后我们将 vm.overcommit_ratio 设置为 100, 那么可以请求的内存就变为 4G100% = 4G