似乎MRI会为每个新线程重复内存分配。
我使用Ubuntu x64,ruby-2.2.4(rvm),这就是我得到的:
刚开始irb:
我看到pmap -d 1656
59760K(已分配内存,或'[stack]'用于程序堆栈[man pmap(1)] )内存使用情况:
创建线程时:
我看到pmap -d 1656
127352K内存使用情况:
所以,我看到重复59760K - > 127352K的内存分配。
这种行为类似于fork()
调用的结果,该调用用于创建新进程,为其创建调用进程数据的副本('copy-on-write'在此上下文之外)过程
但Thread在同一进程中创建并共享其数据,看起来很奇怪......
实际上,这意味着Ruby中的Thread类似于内存使用中的进程限制:当分配的内存越来越接近物理内存大小时,新线程创建失败。
我很好奇,为什么?
更新
这不是重复内存,而是为每个线程额外分配~50K。 感谢@tadman建议这是一个开销,而不是像fork()那样复制内存。