OOM排查与优化

本文详细介绍了Linux系统的OOM机制,包括当系统内存不足时如何选择并杀死进程的原理。通过分析oom_kill.c源代码,展示了OOM打分过程,并讨论了相关参数如oom_adj和oom_score_adj对进程的影响。在排查OOM问题时,建议检查messages日志和使用dmesg、journalctl命令。解决OOM的方法包括增加系统资源、调整程序oom_adj参数以及设置vm.overcommit_memory。需要注意,OOM并不适合处理内存泄漏问题,且即使free显示内存充足,特殊内存地址空间的占用也可能触发OOM。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OOM机制

        OOM指当程序占用内存超过系统内存或系统可调用的内存时,触发LINUX 内核机制(OOM killer),导致某些进程被kill掉;举个栗子,公司里同时有小明与小斌等若干员工,其中公司内部有一个打分机制,就是员工的干饭量(内存),本身公司是能负担所有员工,但这时小明与小斌尤为突出,突然之间干饭量孟增,为了保证公司不倒闭以及维持其他人能继续干饭,公司就通过这个干饭量进行打分,谁的分高就开除谁,然后发现,小明最能干饭,那么公司就把小明开了

OOM打分

       

         Linux内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽内核会把该进程杀掉。

        内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码 linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用 select_bad_process() 选择一个“bad”进程杀掉,判断和选择一个“bad”进程的过程由 oom_badness()决定,最 bad 的那个进程就是那个最占用内存的进程。

        这里附上一段源代码

        

/**

 * oom_badness -heuristic function to determine which candidate task to kill

 * @p: taskst
### 使用 Arthas 工具诊断和解决 OutOfMemoryError (OOM) 问题 Arthas 是一款强大的 Java 诊断工具,能够帮助开发者快速定位 OOM 等性能问题。以下是关于如何利用 Arthas 来诊断和解决 OOM 的方法。 #### 启动 Arthas 并连接目标 JVM 进程 首先需要启动 Arthas,并将其附加到出现问题的目标 JVM 上。可以通过 `jps` 命令查找目标进程 ID(PID),然后执行以下命令来启动 Arthas: ```bash java -jar arthas-boot.jar ``` 输入目标 PID 完成连接后即可进入 Arthas 控制台[^1]。 --- #### 利用 Arthas 获取堆内存状态 在 Arthas 中有多个命令可以帮助分析堆内存的状态以及可能引发 OOM 的原因。 ##### 1. **heapdump 导出堆转储** 如果怀疑程序存在严重的内存泄漏或者已经触发了 OOM 错误,则可以直接生成一份完整的堆转储文件用于进一步分析: ```bash heapdump /path/to/dump/file.hprof ``` 此操作会将当前 JVM 的整个堆快照保存至指定位置以便离线分析工具如 MAT 或 JVisualVM 加载解析[^3]。 --- ##### 2. **objectsize 测量对象大小** 对于某些特定场景下的大对象创建行为导致的 OOM ,可以借助 objectsize 计算单个实例所占空间大小: ```bash objectsize @com.example.MyClass@new() ``` 上述例子展示了测量 MyClass 类新实例化出来的对象实际消耗字节数的情况[^4]。 --- ##### 3. **monitor 方法耗时频率统计** 有时频繁调用某个方法也可能间接造成过多临时变量堆积最终致使 OMM 。此时 monitor 能够提供一段时间范围内各函数被访问次数及时长分布概况: ```bash watch com.example.Service method '{params,returnObj}' 'params + ", " + returnObj' --regex true ``` 这里监控的是名为 service 的类里所有匹配正则表达式的 public 成员函数及其参数返回值变化情况[^2]。 --- ##### 4. **thread 查找死锁或高负载线程** 除了单纯的内存方面外,线程竞争同样可能导致资源枯竭进而诱发 oom 故障现象的发生。 thread 提供了一个简洁明了的方式展示全局范围内的活动线程列表连同它们各自的状态信息等内容。 ```bash thread -n 5 ``` 该指令列出了 CPU 占用率最高的前五个线程详情记录下来便于后续审查是否存在不合理之处。 --- #### 结合其他手段综合处理 当初步定位潜在风险源之后还需要考虑调整相应的 jvm 参数配置以优化整体表现效果。例如合理规划年轻代比例关系(-Xmn),开启自动 dump 功能 (-XX:+HeapDumpOnOutOfMemoryError )等措施共同作用才能从根本上杜绝此类事件再次重现的可能性。 --- ### 总结 通过以上介绍可以看出,arthas 不仅具备强大灵活的功能特性满足日常开发调试需求之外,在面对复杂棘手难题诸如 outofmemoryerror 场景下依然表现出色值得信赖推广使用!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值