Linux:手动减少堆大小

lan*_*ng2 2 linux memory

我正试图模拟记忆力的消耗.所以这就是我的想法:

  1. 关闭提交.
  2. 减少可用堆,以便更快地发生内存耗尽.
  3. 运行测试中的程序.

我的问题是第2步:是否有减少内核将分配的堆大小的技巧?我可以编写另一个分配大量RAM的程序,但可能有更聪明的方法吗?

Pet*_*esh 7

您可以使用ulimit系统调用删除最大进程内存大小.该命令可从shell获得.有问题的选项是-v(最大内存大小),因此例如将进程限制为最大2GB:

ulimit -v 2097152
Run Code Online (Sandbox Code Playgroud)

然后从该shell启动进程.

如果你使用-Hulimit选项,那么它设置一个硬限制,一旦设置就不能增加(root可以增加限制).

如果要从程序进行控制,可以使用以下setrlimit方式进行系统调用:

#include <sys/types.h>
#include <sys/resource.h>

struct rlimit the_limit = { 2097152 * 1024, RLIM_INFINITY };
if (-1 == setrlimit(RLIMIT_AS, &the_limit)) {
  perror("setrlimit failed");
}
Run Code Online (Sandbox Code Playgroud)

这将软限制2GB设置为,您可以通过更改RLIM_INFINITY值来设置硬限制.请注意,如果您是root用户,则只能增加硬限制.

此限制适用于可用于进程的内存总量,而不仅仅是可用作堆的内存.

可以使用该-d选项限制堆内存.setrlimit呼叫的等效名称是RLIMIT_DATA.此限制仅适用于内存分配 - 例如malloc,mmap,静态数据.