stack heap(brk,sbrk , mmap), 文件映射, bss, data , text, 还有page cache, slab(kmalloc连续), vmalloc等内核深处的。
对于进程来说,堆泄漏在死亡时是没问题
但是对于不断获得内存,导致系统内存不足时会触发oom killer。
系统内存不足时会唤醒OOM killer来选择一个进程给杀掉,在我们这个例子中它杀掉了这个正在内存泄漏的程序,该进程被杀掉后,整个系统也就变得安全了。但是你要注意,OOM killer选择进程是有策略的,它未必一定会杀掉正在内存泄漏的进程,很有可能是一个无辜的进程被杀掉
缺点:而OOM这里又有一个全局锁(oom_lock)来进行保护
如果此时系统中有很多进程都在申请内存,那么这些申请内存的进程都会被阻塞在这里,这就形成了一个恶性循环,甚至会引发系统长时间无响应(假死)
一个例子就是oom日志打印太多,有两个解决方法:1.?在发生OOM时尽可能少地打印信息 ? ? ? ? ? 2.调整串口打印级别,不将OOM信息打印到串口-?
很重要的系统服务的oom_score_adj配置为-1000,比如sshd。but?它又不能被杀掉,这就会导致随着它的内存开销变大,OOM killer不停地被唤醒,从而把其他进程一个个给杀掉,我们之前在生产环境中就遇到过类似的案例
访问过程,可以想想hard_design.
首先是top
然后是cat /proc/meminfo
这两个是最开始排查的用的
一个例外
可以通过meminfo几个信息看出