我想控制最大内存,一个进程可以在Mac-OS X 10.8中使用。我觉得设置ulimit -v应该达到目标,但似乎并非如此。我尝试了以下简单的命令:
ulimit -m 512
java -Xms1024m -Xmx2048m SomeJavaProgram
我假设第二个命令应该失败,因为Java Process将通过为自己保留1024MB内存来启动,但它会平静地通过。在我的Sample程序中,我尝试使用以下代码片段分配超过1024MB:
System.out.println("Allocating 1 GB of Memory");
List<byte[]> list = new LinkedList<byte[]>();
list.add(new byte[1073741824]); //1024 MB
System.out.println("Done....");
这两个程序都可以毫无问题地执行。我们如何在Mac-OS X中控制程序的最大内存分配?
答案 0 :(得分:7)
我不确定你是否仍然需要回答这个问题,但是如果其他人碰巧遇到同样的问题,这里就是答案。
ulimit -m
严格限制驻留内存,而不是进程可以从操作系统请求的内存量。
ulimit -v
将限制进程可以从操作系统请求的虚拟内存量。
例如......
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
int size = 1 << 20;
void* memory = NULL;
memory = malloc(size);
printf("allocated %i bytes...\n", size);
return 0;
}
ulimit -m 512
./memory
allocated 1048576 bytes...
ulimit -v 512
./memory
Segmentation fault
如果执行ulimit -a
,它应该提供子进程的所有当前限制的摘要。
正如@ bikram990下面的评论所述,java进程可能没有遵守软限制。要强制执行java内存限制,可以将参数传递给进程(-Xmx,-Xss等...)。
警告!强>
您还可以通过ulimit -H
command设置硬限制,子进程无法对其进行修改。但是,一旦降低,这些限制也不能再次提升,没有提升权限(root)。