用了很长时间ulimit命令,还没认真看这个命令的作用:
下面详细解释一下 ulimit -s unlimited 这个命令:
1. ulimit 是什么
ulimit是 Linux/Unix 系统里的 shell 内置命令,用于控制当前 shell 进程及其子进程所能使用的系统资源上限。- 常见的限制包括:文件大小(
-f)、打开文件数(-n)、虚拟内存大小(-v)、堆栈大小(-s)等。
2. -s 参数:stack size(栈大小)
-s表示 每个线程的栈内存限制(以 KB 为单位)。- 栈内存用于函数调用、局部变量存储、返回地址保存等。
- 如果程序需要的栈空间超过了系统设定的限制,就会触发 栈溢出(stack overflow) 错误,进程通常会收到
Segmentation fault。
3. unlimited 的含义
-
unlimited表示 去掉栈大小限制,即让程序可以根据系统实际内存情况来动态申请需要的栈空间。 -
这在以下情况特别有用:
- 深度递归(如深度优先搜索 DFS、编译器/解释器的递归下降分析)。
- 大数组/大局部变量(某些数值计算程序会在栈上分配很大的局部数组)。
- 某些需要嵌套调用的科学计算/图像处理/神经网络框架。
4. 使用效果
- 默认情况下,Linux 系统的
ulimit -s一般是 8192 KB(8MB),具体依发行版而不同。
- 执行
ulimit -s unlimited后,新的限制值变为“无限制”。 - 可以通过
ulimit -a查看当前所有资源限制,确认stack size一栏。
5. 注意事项
-
风险:
- 如果递归过深或栈分配过大,可能会把系统内存(RAM)耗尽,造成 系统卡顿或 OOM(out-of-memory)。
- 因此一般只在需要时临时开启,不建议作为永久设置。
-
作用范围:
- 只对 当前 shell 进程及其子进程生效,不会影响全局系统设置。
- 关闭 shell 或开新终端后会恢复默认限制。
-
持久化方法:
- 可以写入
~/.bashrc、~/.zshrc等启动脚本中; - 或在
/etc/security/limits.conf//etc/systemd/system.conf等系统配置文件中设置。
- 可以写入
6. 示例
# 查看当前栈大小限制(单位 KB)
ulimit -s
# 设置栈大小无限制
ulimit -s unlimited
# 验证修改后的值
ulimit -a | grep stack✅ 一句话总结:
ulimit -s unlimited 表示把每个线程的栈内存限制解除,让程序在需要时可以用更多的栈空间,常用于解决深递归或大局部变量导致的栈溢出问题,但要注意可能带来内存风险。