macos 内存溢出无显式“oom killed”日志,但可通过unified logging中kernel_task异常、内存压缩激增、交换启用、进程终止警告及vm子系统事件综合判断;推荐用log show精准过滤com.apple.kernel/com.apple.xnu日志并结合活动监视器闭环分析。
macos 的内存分配溢出(如 oom — out of memory)通常不会直接记录为一条“oom killed process”日志(不像 linux 的 dmesg 那样明确),但系统会在 unified logging 中留下关键线索:kernel_task 异常行为、内存压缩激增、交换启用、进程被终止前的警告,以及内核级内存管理事件。使用 log show 可以有效回溯这些信号。
聚焦内核与内存子系统的日志流
内存压力达到临界点时,macOS 内核会通过 com.apple.kernel 和 com.apple.xnu 子系统发出调度日志。建议优先筛选这些来源:
- 执行:
log show --predicate 'subsystem == "com.apple.kernel" AND eventMessage contains "memory" OR eventMessage contains "compress"' --last 24h - 补充查看内核内存管理器行为:
log show --predicate 'subsystem == "com.apple.xnu" AND category == "vm"' --last 12h - 若怀疑某次卡顿或重启前发生溢出,可加时间锚点:
log show --start "2026-07-06 14:00:00" --end "2026-07-06 14:15:00" --predicate 'eventMessage contains "pageout" OR eventMessage contains "swap" OR eventMessage contains "throttle"
识别 OOM 相关的关键日志模式
以下内容出现在日志中,往往意味着系统已逼近或触发内存保护机制:
- “VM: Pageout daemon throttling”:页面回收进程因资源紧张被迫降频,是内存饱和早期信号
- “Compressor: compressed X pages”(X 持续 > 50000):压缩页数超 200MB(50000 × 4KB),说明活跃内存严重不足
- “swapfileX created” 或 “swap used: Y MB”:交换文件启用且用量上升,物理内存已无法满足需求
- “kernel_task: adjusting pressure level to high”:内核主动提升内存压力等级,后续可能触发 App 终止
- 虽无显式 “killed process due to memory pressure”,但可交叉验证:
log show --predicate 'eventMessage contains "terminated" AND sender == "launchd"' --last 1h,再比对时间戳是否紧随上述内核日志
结合活动监视器数据做闭环判断
log 命令提供的是事件痕迹,而内存压力图形和数值反映实时状态。二者需对照分析:
- 当
log show --last 1h中出现多条"memory pressure high",同时活动监视器底部“内存压力”显示持续红色,基本确认发生溢出性调度 - 若日志中反复出现
"compressor occupied"且“被压缩”值长期高于 2GB,说明系统长期处于内存临界状态,非瞬时峰值 - 发现
"swap used"日志后,立即检查“已使用的交换”数值——该值大于 0.5GB 时,已实质进入虚拟内存依赖阶段
导出与持续监控建议
对排查周期较长的问题,推荐结构化留存日志:
- 保存最近一次疑似溢出时段的完整内核内存日志:
log show --predicate 'subsystem == "com.apple.kernel" AND (eventMessage contains "vm" OR eventMessage contains "compress")' --last 6h > /tmp/memory_debug.log - 用
log stream实时观察(需在问题复现时运行):log stream --predicate 'subsystem == "com.apple.kernel" AND eventMessage contains "pressure"' - 避免仅依赖
log show --last 1d全量输出——日志体积大、干扰多;始终用--predicate精准过滤,再辅以| grep -i "compress\|swap\|throttle"快速定位











