如何在Linux中限制C代码的堆大小
作者:互联网
我想知道是否有可能限制在Linux机器上执行的C代码的分配堆大小.
有可能这样做吗?
这样做的目的是,除了其他全局变量和局部变量之外,我正在动态分配〜70KBytes的内存和〜20KBytes的堆栈内存.动态分配通过malloc()完成.
因此,为了确认问题不在于堆分配,我想限制将要运行的C代码的堆内存.
我在线阅读了几篇文章,发现如果我们使用malloc(),则内存可能被过度提交,但是如果我们使用calloc(),我们将仅获得可用内存,而没有过度承诺,因为calloc()必须初始化内存块给出指针之前先设置为零.但是由于初始化开销,我不想使用calloc().
解决方法:
您可以在程序内部使用setrlimit(2),可能使用RLIMIT_AS(如Ouah’s answer所引用).
更好的是,让您的外壳做到这一点.使用bash是内置的ulimit.
确保您的程序确实在任何地方都正确且完整地处理了malloc失败(针对NULL指示失败,对malloc的每个返回进行测试).
如果您不测试malloc的结果,则在失败时,它会给出NULL,并且下一条指令很有可能会取消引用空指针(或非常接近它的某个地址),即undefined behavior,而在Linux上给出的是segmentation violation .
您可能应该在调试阶段考虑使用valgrind.
顺便说一句,今天只有70KB的内存(至少在Linux笔记本电脑,台式机甚至平板电脑上).请注意,C standard library可能在幕后调用malloc(例如,fopen提供了一个FILE句柄,该句柄具有一些缓冲区,可以通过malloc在内部获取)
并且可以使用以下命令在Linux上禁用memory overcommit
echo 0 > /proc/sys/vm/overcommit_memory
以root身份运行.
标签:memory,heap-memory,c-3,memory-management,linux 来源: https://codeday.me/bug/20191120/2044533.html