中关村在线

软件

Linux内存溢出解决方法

内存溢出指程序申请内存时,所需空间超过系统可分配量,导致无法正常运行。例如声明一个整型变量,却存入超出其范围的长整型数值,就会引发此类问题。

1、 内存严重不足时,内核可选择直接崩溃或终止部分进程以释放资源。

2、 每个进程在系统中都对应一个名为 oom_score 的参数,该参数位于 /proc/PID/oom_score 目录下。当系统内存不足触发 OOM(Out of Memory)机制时,内核会优先终止 oom_score 值较高的进程以释放资源。若将某个进程的 oom_score 设为 0,则表示禁止 OOM killer 终止该进程。通过调整 /proc/PID/oom_adj 文件中的数值,可以间接影响 oom_score 的大小。oom_adj 的取值范围是 -17 到 15,其中当设置为 -17 时,对应的 oom_score 将强制归零,从而保护该进程不被杀死。其余可调节范围为 -16 至 15,数值越小表示优先级越高,越不容易被终止;反之,数值越大则越容易被选中。oom_score 的具体数值是通过 2 的 oom_adj 次方计算得出的,因此随着 oom_adj 增大,oom_score 呈指数级增长。这意味着 oom_adj 越大的进程,其 oom_score 越高,在内存紧张时也就越可能被内核优先清除,从而保障系统的整体稳定性。

3、 可通过执行命令 echo 0 > /proc/PID/oom_adj 来避免指定进程被系统 OOM Killer 终止,从而有效保护关键进程不因内存不足而被强制结束。

4、 相关参数说明如下:panic_on_oom用于控制系统在发生内存溢出(OOM)时的行为。当该参数设为0时,系统触发OOM后会启动OOM Killer机制,通常会选择终止引发内存耗尽的进程,从而恢复系统正常运行。若设置为1,表示在存在内存策略(mempolicy)或CPU集(cpusets)等资源限制的情况下,若这些限制导致某些节点内存不足并引发OOM,则OOM Killer将优先终止此类受限进程中的一个,以使系统恢复正常。当该值设为2时,一旦发生OOM,系统将直接触发内核恐慌(panic),不会尝试通过杀死进程来恢复,可能导致系统崩溃或重启。此参数的设定需根据实际应用场景对稳定性与可用性的要求进行权衡。

5、 当系统发生内存溢出时,oom_kill_allocating_task 参数用于控制 oom killer 的行为。若该值为非零,系统会遍历进程列表,优先终止占用内存最多的进程,以尽可能释放更多内存;而当该值设为0时,仅直接终止触发内存不足的那个进程,不进行额外的进程扫描,响应更快但回收的内存相对较少,适用于希望快速处理且避免影响其他进程的场景。

6、 当触发OOM Killer时,该参数控制是否输出相关进程的详细信息,如进程ID、用户ID、线程组ID、虚拟内存、物理内存占用及CPU使用情况,默认值为0,表示不输出。

展开全文
人赞过该文
内容纠错

相关电商优惠

评论

更多评论
还没有人评论~ 快来抢沙发吧~

读过此文的还读过

点击加载更多

内容相关产品

说点什么吧~ 0

发评论,赚金豆

收藏 0 分享
首页查报价问答论坛下载手机笔记本游戏硬件数码影音家用电器办公打印 更多

更多频道

频道导航
辅助工具