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

问题描述 投票:0回答:2

我想控制Mac-OS X 10.8中进程可以使用的最大内存。我觉得设置 ulimit -v 应该可以实现目标,但似乎并非如此。我尝试执行以下简单命令:

    ulimit -m 512

    java -Xms1024m -Xmx2048m SomeJavaProgram

我假设第二个命令应该失败,因为 Java 进程将通过为自己保留 1024MB 内存来启动,但它会平静地通过。在我的示例程序中,我尝试使用以下代码片段分配超过 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 中程序的最大内存分配?

macos memory memory-management
2个回答
11
投票

我不确定您是否仍然需要回答这个问题,但这里是答案,以防其他人碰巧有同样的问题。

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
命令设置硬限制,子进程无法修改该硬限制。但是,如果没有提升权限(root),这些限制一旦降低就无法再次提高。


0
投票

目前,在 macOS Sonoma 14.2.1 上,ulimit 的联机帮助页(例如

man 3 ulimit
)说明如下:

The ulimit() function will get and set process limits.  Currently, this is limited to the maximum file size.

来自 macOS 附带的

ulimit(3)
手册/联机帮助页,日期为 2003 年 1 月 4 日。

至于

ulimit
内置 shell 命令,很可能这一切都是
ulimit()
C 函数的包装。因此,在 macOS 上似乎无法使用
ulimit
设置内存限制。也许尝试使用
setrlimit()
C 函数来代替。

© www.soinside.com 2019 - 2024. All rights reserved.