限制Ruby进程的堆大小不起作用

我想限制Ruby进程可用的堆大小,即如果进程试图获取更多堆,它应该中止。 Ruby进程是从zsh调用的。 为了测试这个概念,我做了以下工作:

在我的Ruby程序中,我使用以下函数计算堆大小:

def heap_size
   GC.stat[:heap_length] *  # Number of pages
   GC::INTERNAL_CONSTANTS[:HEAP_OBJ_LIMIT] * # Number of slots in one page
   GC::INTERNAL_CONSTANTS[:RVALUE_SIZE] # Size of one slots in bytes
end

通过为该程序设置合适的参数,我可以看到初始堆大小,并验证如何分配一定数量的对象时堆的增加情况。

在我的调用zsh脚本中,我使用limit命令来设置子进程的shell限制,以具有以下值:

cputime         unlimited
filesize        unlimited
datasize        9MB
stacksize       8MB
coredumpsize    0kB
addressspace    1MB
memorylocked    1MB
maxproc         266
descriptors     2560

通过这个设置,我仍然可以设法运行报告堆消耗量的进程,例如,初始堆大小为1077120字节,在堆上分配数据后为36214080字节。

尽管初始大小刚好低于1MB的限制,但在执行期间堆增长到大约36MB,并且我预期操作系统会终止进程。

我是否误解了限制命令应该工作的方式?

我正在使用OSX 10.6

顺便说一下,我还使用ulimit验证了限制,以防万一我的zsh的限制命令以某种方式被破坏,但这些看起来也是合理的:

$ /usr/bin/ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) 9216
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) 1024
max memory size         (kbytes, -m) 1024
open files                      (-n) 2560
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 266
virtual memory          (kbytes, -v) 1024
链接地址: http://www.djcxy.com/p/80253.html

上一篇: Limiting heap size for a Ruby process does not work

下一篇: Java Heap allocation acting different