当Thread.new时,MRI复制内存分配

时间:2017-04-18 17:13:53

标签: ruby multithreading mri

似乎MRI会为每个新线程重复内存分配。

我使用Ubuntu x64,ruby-2.2.4(rvm),这就是我得到的:

刚开始irb:

enter image description here

我看到pmap -d 1656 59760K(已分配内存,或'[stack]'用于程序堆栈[man pmap(1)] )内存使用情况:

enter image description here

创建线程时:

enter image description here

我看到pmap -d 1656 127352K内存使用情况:

enter image description here

所以,我看到重复59760K - > 127352K的内存分配。

这种行为类似于fork()调用的结果,该调用用于创建新进程,为其创建调用进程数据的副本('copy-on-write'在此上下文之外)过程

但Thread在同一进程中创建并共享其数据,看起来很奇怪......

实际上,这意味着Ruby中的Thread类似于内存使用中的进程限制:当分配的内存越来越接近物理内存大小时,新线程创建失败。

我很好奇,为什么?

更新

这不是重复内存,而是为每个线程额外分配~50K。 感谢@tadman建议这是一个开销,而不是像fork()那样复制内存。

0 个答案:

没有答案