我正在尝试修改一些JNI代码以限制进程可以使用的内存量。这是我用来测试linux和osx上的setRlimit的代码。在linux中,它按预期工作,buf为null。
此代码将限制设置为32 MB,然后尝试malloc 64 MB缓冲区,如果缓冲区为null则setrlimit工作。
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int main(int argc) {
pid_t pid = getpid();
struct rlimit current;
struct rlimit *newp;
int memLimit = 32 * 1024 * 1024;
int result = getrlimit(RLIMIT_AS, ¤t);
if (result != 0)
errExit("Unable to get rlimit");
current.rlim_cur = memLimit;
current.rlim_max = memLimit;
result = setrlimit(RLIMIT_AS, ¤t);
if (result != 0)
errExit("Unable to setrlimit");
printf("Doing malloc \n");
int memSize = 64 * 1024 * 1024;
char *buf = malloc(memSize);
if (buf == NULL) {
printf("Your out of memory\n");
} else {
printf("Malloc successsful\n");
}
free(buf);
}
在linux机器上,这是我的结果
memtest]$ ./m200k
Doing malloc
Your out of memory
在osx 10.8上
./m200k
Doing malloc
Malloc successsful
我的问题是,如果这对osx不起作用,那么有一种方法可以在darwin内核中完成这项任务。手册页似乎都表示它会起作用,但似乎没有这样做。我已经看到launchctl支持限制内存,但我的目标是在代码中添加此功能。我也试过使用ulimit,但这也不起作用,我非常确定ulimit使用setrlimit来设置限制。当超过setrlimit soft或hardlimit时,我还能看到一个信号。我找不到一个。
如果可以在Windows中完成奖励积分。
感谢您的任何建议
更新
正如所指出的那样,RLIMIT_AS在手册页中明确定义,但是被定义为RLIMIT_RSS,因此如果参考文档,RLIMIT_RSS和RLIMIT_AS在OSX上是可互换的。
#define RLIMIT_RSS RLIMIT_AS /* source compatibility alias */
测试了trojanfoe使用RLIMIT_DATA的优秀建议,这里描述了
The RLIMIT_DATA limit specifies the maximum amount of bytes the process
data segment can occupy. The data segment for a process is the area in which
dynamic memory is located (that is, memory allocated by malloc() in C, or in C++,
with new()). If this limit is exceeded, calls to allocate new memory will fail.
对于linux和osx来说结果是一样的,那就是malloc对两者来说都是成功的。
chinshaw@osx$ ./m200k
Doing malloc
Malloc successsful
chinshaw@redhat ./m200k
Doing malloc
Malloc successsful