我想控制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 中程序的最大内存分配?
我不确定您是否仍然需要回答这个问题,但这里是答案,以防其他人碰巧有同样的问题。
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),这些限制一旦降低就无法再次提高。
目前,在 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 函数来代替。