在 Linux 下“限制进程内存”有多种方式,取决于你是临时运行程序、写代码控制、还是系统级限制。下面按常见场景总结。
ulimit(shell 级别)限制当前 shell 及其子进程的资源。
ulimit -v 524288 # 限制虚拟内存为 512MB(单位 KB)
./your_program
常用参数:
-v:虚拟内存(virtual memory)-m:常驻内存(RSS,很多系统已不严格生效)-s:栈大小⚠️ 只对当前 shell 会话有效。
systemd-run(推荐,现代 Linux)临时用 systemd 启动受限进程:
systemd-run --scope -p MemoryMax=512M ./your_program
或长期服务:
[Service]
MemoryMax=512M
cgroups(系统级硬限制)适用于服务器、容器。
cgcreate -g memory:/mygroup
echo 536870912 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
echo $PID > /sys/fs/cgroup/memory/mygroup/tasks
cgroup v2 示例:
echo 512M > /sys/fs/cgroup/mygroup/memory.max
docker run -m 512m --memory-swap=512m myimage
setrlimit(POSIX)#include <sys/resource.h>
struct rlimit rl;
rl.rlim_cur = 512 * 1024 * 1024;
rl.rlim_max = 512 * 1024 * 1024;
setrlimit(RLIMIT_AS, &rl);
RLIMIT_AS:虚拟地址空间RLIMIT_DATA:堆RLIMIT_STACK:栈echo 100 > /proc/$PID/oom_score_adj
值越大越容易被杀。
nice / cpulimit虽然不是内存,但常一起用。
| 场景 | 推荐方式 |
|---|---|
| 临时跑程序 | ulimit / systemd-run |
| 服务进程 | systemd unit |
| 多进程隔离 | cgroup |
| 容器 | Docker / Kubernetes |
| 程序自身控制 | setrlimit |
如果你能说明:
我可以给你更精确的示例。