Linux 内存管理与 GDB 调试全解析
1. 内存耗尽问题
1.1 内存分配策略
标准的内存分配策略是过度提交(over-commit),即内核允许应用程序分配的内存超过物理内存。多数情况下,这种策略可行,因为应用程序通常会请求比实际需求更多的内存。这也有助于 fork(2) 系统调用的实现,因为在设置了写时复制标志的情况下,复制一个大程序是安全的。大多数情况下, fork 之后会调用 exec 函数,该函数会取消内存共享并加载新程序。
1.2 内存耗尽情况(OOM)
然而,特定的工作负载可能导致一组进程同时尝试使用已分配的内存,从而导致内存需求超过实际可用内存,这就是内存耗尽(OOM)情况。此时,唯一的解决办法是杀死一些进程,直到问题解决,这就是 OOM 杀手的工作。
1.3 内核分配调优参数
可以通过 /proc/sys/vm/overcommit_memory 来设置内核分配的调优参数,具体选项如下:
| 参数值 | 描述 |
| ---- | ---- |
| 0 | 启发式过度提交 |
| 1 | 总是过度提交,从不检查 |
| 2 | 总是检查,从不过度提交 |
默认值为 0,在大多数情况下是最佳选择。选项 1 仅在运行处理大型稀疏数组并分配大量内存但只写入一小部分的程序时有用,在嵌入式系统中这类程序很少见。选项 2 在担心内存耗尽的情况下,如关键任务或安全关键型应用中,似乎是个不错的选择。它会使超过提交限
超级会员免费看
订阅专栏 解锁全文
1647

被折叠的 条评论
为什么被折叠?



