将内存分配限制为Mac-OS X 10.8中的进程

Nar*_*mar 9 memory macos memory-management

我想控制最大内存,一个进程可以在Mac-OS X 10.8中使用.我觉得设置ulimit -v应该达到目标,但似乎并非如此.我尝试了以下简单的命令:

    ulimit -m 512

    java -Xms1024m -Xmx2048m SomeJavaProgram
Run Code Online (Sandbox Code Playgroud)

我假设第二个命令应该失败,因为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....");
Run Code Online (Sandbox Code Playgroud)

这两个程序都可以毫无问题地执行.我们如何控制Mac-OS X中程序的最大内存分配?

Jas*_*son 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; 

}
Run Code Online (Sandbox Code Playgroud)


ulimit -m 512
./memory
allocated 1048576 bytes...
Run Code Online (Sandbox Code Playgroud)


ulimit -v 512
./memory
Segmentation fault
Run Code Online (Sandbox Code Playgroud)


如果执行ulimit -a它,则应提供子进程的所有当前限制的摘要.

正如@ bikram990下面的评论中提到的,java进程可能不会遵守软限制.要强制执行java内存限制,可以将参数传递给进程(-Xmx,-Xss等...).

警告!

您还可以通过ulimit -H 命令设置硬限制,子程序无法修改该命令.但是,一旦降低,这些限制也不能再次提升,没有提升权限(root).

  • 这在Linux上很有用,但对OSX不起作用,这就是我用赏金支持这个问题的原因.感谢您提供重现的代码. (3认同)