【问题标题】:Limit Memory allocation to a process in Mac-OS X 10.8在 Mac-OS X 10.8 中限制对进程的内存分配
【发布时间】:2012-08-29 10:25:25
【问题描述】:

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

    ulimit -m 512

    java -Xms1024m -Xmx2048m SomeJavaProgram

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


【解决方案1】:

我不确定你是否还需要回答这个问题,但如果其他人碰巧有同样的问题,这里是答案。

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 在下面的cmets 中所述,java 进程可能不会遵守软限制。要强制执行 java 内存限制,您可以将参数传递给进程(-Xmx、-Xss 等...)。

警告!

您也可以通过ulimit -Hcommand设置硬限制,子进程无法修改。但是,如果没有提升权限(root),一旦降低,这些限制也不能再次提高。

【讨论】:

  • 这在 Linux 上效果很好,但不适用于 OSX,这就是我支持这个问题的原因。感谢您提供重现的代码。
  • ulimit 行为通常由 POSIX 管理,而 OSX 符合 POSIX,所以我有点震惊。该示例指定ulimit -m,它不会影响对总虚拟内存大小的限制。我很好奇ulimit -a 实际报告了什么。
  • @Jason pelson 正在 java 进程上尝试这个。我认为java可能正在修改内存的硬限制。见stackoverflow.com/questions/7997602/c-change-max-ram-limit
  • FWIW,我没有使用 Java(尽管最初的问题确实如此)。 @Jason 的 C 示例很好地展示了这个问题,恕我直言,这更多地与 OSX 相关,而不是 Java VM。
  • 内存限制 OS X 不能使用 ulimit 和相应的系统调用。我没有尝试过建议使用launchd。 stackoverflow.com/questions/3274385/…
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 2013-03-03
  • 2013-07-19
  • 2012-10-13
  • 1970-01-01
  • 2011-01-28
  • 2012-12-31
  • 1970-01-01
相关资源
最近更新 更多