37

我的程序在我运行它们的一半时间里都会耗尽内存。在 Linux 下,我可以使用 ulimit -v mem-in-kbytes 设置可用内存的硬限制。实际上,我使用 ulimit -S -v mem-in-kbytes,所以我在程序中遇到了适当的内存分配问题,我可以中止。

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

2008 年,MacRumors对同一问题进行了一些讨论,但没有人提出一个好的替代方案。这应该是程序可以了解它消耗过多内存或通过操作系统设置限制的一种方式。

4

3 回答 3

7

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

为什么?因为RLIMIT_DATARLIMIT_AS选项在当前版本的 XNU(macOS 内核)中setrlimit()实际上不做任何事情。

于 2020-05-05T14:23:13.633 回答
6

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

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

<key>SoftResourceLimits</key>
<dict>
    <key>Stack</key>
    <integer>10000000000</integer>
</dict>

有各种可用的键……可以在Apple 的 MAN 页面上找到。

我认为另一种方法是在/etc/launchd.conf(系统)或/etc/launchd-usr.conf(peruser )中设置一个值。例如,您的 launchd.conf 可能包含...

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

如果你问我,launchd 的所有功能的文档都很简短。就好像 Apple 可能不在乎/不希望人们在他们的墙外真正了解它是如何工作的。 掌握 launchd有如此多的力量,而且它错综复杂......但是关于如何正确实施它们的具体/官方资源很少。

于 2011-05-29T19:17:45.160 回答
1

setrlimit应该做的工作。我相信这是BSD相当于ulimit......

于 2010-07-18T19:36:52.480 回答