0

0

Linux 内存溢出问题_进程内存限制

冷炫風刃

冷炫風刃

发布时间:2026-03-16 12:07:46

|

525人浏览过

|

来源于php中文网

原创

Linux中OOM是系统内存压力下OOM Killer主动终止进程自救,非真正耗尽内存;可通过cgroups设硬限、ulimit -v控虚拟内存、应用层监控RSS并处理分配失败来主动限制单进程内存。

linux 内存溢出问题_进程内存限制

Linux 系统中出现“内存溢出”(OOM)并非内核真的耗尽所有内存,而是当系统无法为新内存申请分配足够页帧、且无法通过回收缓存或交换空间缓解时,OOM Killer 被触发,强制终止一个或多个进程以自救。此时进程被杀通常不是因为自身设置了硬性限制,而是系统全局内存压力下的被动选择。但你确实可以通过多种机制对单个进程的内存使用施加主动限制,从而避免它成为 OOM Killer 的目标,或提前阻止其无节制增长。

1. 使用 cgroups v1 或 v2 限制进程内存上限

cgroups 是 Linux 控制资源使用的标准机制,v2 更简洁统一,推荐优先使用:

  • v2 示例(推荐):创建 memory controller 子树,写入最大允许内存(如 512MB):
    mkdir /sys/fs/cgroup/myapp<br>echo 536870912 > /sys/fs/cgroup/myapp/memory.max<br>echo $$ > /sys/fs/cgroup/myapp/cgroup.procs  # 将当前 shell 加入

    后续在此 cgroup 中启动的进程(如 ./myserver)将被严格限制在 512MB 内,超限时会被 kernel OOM killer 杀掉(注意:是该 cgroup 内部的 OOM,非全局)。
  • v1 兼容方式:使用 memory.limit_in_bytesmemory.soft_limit_in_bytes,但需确保 memory 子系统已挂载,且配置更分散。

2. 启动时用 ulimit 限制虚拟地址空间(适用于 shell 启动的进程)

ulimit -v 可设进程最大虚拟内存(单位 KB),对 malloc/new 分配生效,但不控制 mmap、共享内存或 page cache:

Machine Translation
Machine Translation

聚合多个来源的AI翻译

下载
  • ulimit -v 524288 # 限制为 512MB 虚拟内存
  • 随后运行 ./myprogram,若尝试分配超过该值的虚拟地址空间,系统调用(如 brkmmap)会直接返回 ENOMEM,程序可捕获错误处理,而非等到 OOM Killer 干预。
  • 注意:ulimit -m(物理内存)在多数现代内核中已被忽略,不可依赖。

3. 应用层配合:启用内存分配失败检查 + 设置 RSS 上限告警

内核不主动通知进程“快超限了”,但你可以主动监控:

  • 定期读取 /proc/[pid]/statm/proc/[pid]/status 中的 VmRSS 字段,判断实际物理内存占用。
  • 在关键路径中检查 malloc 返回值是否为 NULL(尤其在嵌入式或严控环境);C++ 中可设置 new_handler 捕获分配失败。
  • 结合 cgroups 的 memory.high(v2)实现软限:当 RSS 接近该值时,内核会开始积极回收该 cgroup 的 page cache,避免直接触发 OOM —— 这比硬限更友好。

4. 避免误判:区分“OOM Killer 日志”与“应用主动退出”

确认是否真由 OOM 导致进程消失:

  • dmesg -T | grep -i "killed process",若看到类似 Killed process 1234 (java) total-vm:2048000kB, anon-rss:819200kB, file-rss:0kB,即为 OOM Killer 所为。
  • 若进程日志显示 std::bad_allocCannot allocate memory 或崩溃在 malloc,大概率是 ulimit -v 触发或应用未处理分配失败,而非系统级 OOM。
  • 注意 swap 启用状态:有 swap 时 OOM 更晚发生,但延迟高;禁用 swap(swapoff -a)可让内存压力更早暴露,利于测试限制策略有效性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1132

2024.03.01

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1564

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

716

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

801

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

588

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

570

2023.07.20

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

2

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.7万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号