Macos 如何限制OSX程序的内存?ulimit-v都不-m正在工作

Macos 如何限制OSX程序的内存?ulimit-v都不-m正在工作,macos,memory,virtual,launchd,ulimit,Macos,Memory,Virtual,Launchd,Ulimit,我的程序有一半的时间内存不足。在Linux下,我可以使用ulimit-v mem(以KB为单位)设置可用内存的硬限制。实际上,我使用ulimit-S-v mem,单位为KB,因此我在程序中得到了一个适当的内存分配问题,我可以中止 但是。。。ulimit在OSX 10.6中不起作用。我试过使用-s和-m选项,但它们不起作用 2008年,关于同一问题的讨论也在讨论中,但没有人提出一个好的替代方案。这应该是一种程序可以知道它花费太多内存或通过操作系统设置限制的方法。应该完成这项工作。我相信这是BSD的

我的程序有一半的时间内存不足。在Linux下,我可以使用ulimit-v mem(以KB为单位)设置可用内存的硬限制。实际上,我使用ulimit-S-v mem,单位为KB,因此我在程序中得到了一个适当的内存分配问题,我可以中止

但是。。。ulimit在OSX 10.6中不起作用。我试过使用-s和-m选项,但它们不起作用


2008年,关于同一问题的讨论也在讨论中,但没有人提出一个好的替代方案。这应该是一种程序可以知道它花费太多内存或通过操作系统设置限制的方法。

应该完成这项工作。我相信这是BSD的等价物,
ulimit

在我自己努力解决这个问题后(成功有限),我决定有两种方法可以做到这一点

您可以为可执行文件设置启动项。。plist的重要部分是一个部分,例如

<key>SoftResourceLimits</key>
<dict>
    <key>Stack</key>
    <integer>10000000000</integer>
</dict>
如果你问我的话,launchd所有功能的文档都是不完整的。。这就好像苹果可能不在乎/不想让墙外的人真正了解这一切是如何运作的。通过掌握发射和它的复杂性。。。但是,关于如何正确实施这些措施,几乎没有具体的/官方的资源可用。

你不能。苹果可以(使用
ledger()
系统调用,这是私有的),但你不能。我不完全确定launchd的选项是否有效——当然,如果它仍然使用上一个开源版本(从10.9.5开始)中可见的代码,它就不会了,因为它调用了
setrlimit()
,但从那时起它就被大量重写了,尽管我看不到它调用
ledger()
,如果这能起作用的话,我希望它能起作用


为什么??因为
setrlimit()
RLIMIT_DATA
RLIMIT_AS
选项在当前版本的XNU(macOS内核)中实际上没有任何作用。

我查看了
setrlimit
的手册页,看不到如何设置虚拟内存的限制,虽然可以设置物理内存的限制,但我知道bash ulimit是直接调用setrlimit实现的。在Linux手册页中,有一个选项RLIMIT_AS,它限制“进程虚拟内存(地址空间)的最大大小(以字节为单位)”,这就是我想要控制的。我真的不在乎物理内存的限制。我想知道整个程序何时超过2Gb。嗯,在OSX的setrlimit手册页上,有一个RLIMIT_AS。最近的是RLIMIT_RSS。事实上,根据我在Activity Monitor.Mmm中看到的情况,IMHO OS X似乎分配了很多虚拟内存。。。SUSv3需要
RLIMIT_AS
,(请参阅),而OS X作为SUSv3 UNIX销售,因此它应该支持
RLIMIT_AS
。实际上,
RLIMIT_定义为
,尽管手册页中没有提到它。你能试试看它是否真的实现了吗?看来我应该试试。。。谢谢。互联网上有各种各样的报道称,
setrlimit
在达尔文操作系统(OSX)上是完全失败的。更重要的是,我似乎无法使它与
setrlimit
一起工作,无论是使用RLIMIT_RSS、RLIMIT_DATA、RLIMIT_AS还是(到达此处)RLIMIT_STACK。就目前情况而言,赏金将是不可抵挡的。+1我面临着launchd,我不能放弃它。如果它以任何一致的方式工作,我会一直使用它。
umask 002
limit stack 67104768 67104768
limit maxproc 3400 4500
limit maxfiles 256 unlimited
setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin