如何限制OS X程序的内存? ulimit -v既不是 -m也不是。

问题描述 投票:32回答:3

我的程序在运行一半的时间里都会耗尽内存,我可以使用 ulimit -v mem-in-kbytes 设置可用内存的硬限制。在Linux下,我可以使用ulimit -v mem-in-kbytes对可用内存进行硬限制。事实上,我使用ulimit -S -v mem-in-kbytes,这样我就会在程序中遇到适当的内存分配问题,我就可以放弃。

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

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

macos memory virtual launchd ulimit
3个回答
6
投票

经过自己的努力(成功率有限),我确定似乎有两种方法可以做到这一点...。

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

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

有各种可用的密钥......可以在下面找到 苹果的MAN页面.

另一种方法。我想的值,是通过在 等launchd.confetclaunchd-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 功能的文档都很糟糕。这就好像苹果可能不关心希望人们在他们的墙外实际了解它是如何工作的。 有这么多的力量 掌握了Launchd和它的复杂性... ...但很少有具体的官方资源可用于如何正确实施它们。


2
投票

setrlimit 应该可以完成这项工作。我相信这相当于BSD中的 ulimit...


1
投票

你不能。 苹果可以(使用 ledger() 系统调用,这是私有的),但你不能。 我不太确定 launchd 的选项是否有效 - 如果它还在使用上一个开源版本中可见的代码(从 10.9.5 开始),当然不会,因为它调用了 setrlimit()但从那时起,它已经被大幅改写了,尽管我看不到它在呼叫 ledger()如果这东西能用的话,我希望它能用。

为什么这么说?因为... RLIMIT_DATARLIMIT_AS 选项以 setrlimit() 其实并不 当前版本的XNU(macOS内核)中的任何东西。

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