我的程序耗尽内存,就像我运行它们的时间的一半。在Linux下,我可以使用ulimit -v mem-in-kbytes设置可用内存的硬限制。实际上,我使用ulimit -S -v mem-in-kbytes,所以我在程序中得到了正确的内存分配问题,我可以中止。
但是...... ulimit在OSX 10.6中不起作用。我尝试过使用-s和-m选项,但它们无法正常工作。
2008年,MacRumors对同一问题进行了一些讨论,但没有人提出好的选择。这应该是一个程序可以学习它花费太多内存或通过操作系统设置限制的方式。
答案 0 :(得分:6)
在与自己挣扎之后(成功有限),我已经确定似乎有两种方法可以做到这一点......
你可以为你的可执行文件设置一个launchd项目.. plist的重要部分是一个部分,例如..
<key>SoftResourceLimits</key>
<dict>
<key>Stack</key>
<integer>10000000000</integer>
</dict>
有各种可用的密钥...可以在 Apple's MAN page .
找到另一种方法,我认为,是通过在 /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来获得There is so much power并且它是错综复杂的...但是关于如何正确实施它们的具体/官方资源很少。
答案 1 :(得分:3)
不能。 Apple可以(使用专用的ledger()
系统调用),但不能这样做。我不确定启动的选项是否有效-当然,如果它仍在使用上一个开源版本(从10.9.5版开始)中可见的代码,则不会,因为它调用了setrlimit()
,但是从那时起,它已经进行了实质性的重写,尽管我看不到它调用ledger()
,如果可以正常运行,我希望它能实现。
为什么?因为RLIMIT_DATA
的{{1}}和RLIMIT_AS
选项实际上在当前版本的XNU(macOS内核)中没有做。
答案 2 :(得分:2)
setrlimit
应该做的工作。我相信这是相当于ulimit
...