MRI Ruby垃圾收集器没有收集所有东西?

时间:2016-04-09 17:38:01

标签: ruby garbage-collection

$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
$ irb

IRB启动后的内存使用情况: 56MB

>> a = []
>> 1000.times { a << (1..50000).to_a.map { |i| "abc" }.join }
>> a = nil

现在使用内存: 244MB (正如预期的那样)

>> GC.start

现在使用内存: 146MB

内存的其余部分去了哪里以及它为什么没有被垃圾收集器释放?

1 个答案:

答案 0 :(得分:0)

Ruby进程并不总是使用生存对象数量所需的确切内存量。它以预定大小的块分配,并在GC之后的某个时间释放块。

请参阅http://www.sitepoint.com/ruby-uses-memory/

  

如果使用的对象多于Ruby可以容纳的内存,则必须分配额外的内存。从操作系统请求内存是一项昂贵的操作,因此Ruby尝试不经常这样做。它不是一次要求另外几个KB,而是分配比它需要的更大的块。

     

...

     

Ruby保留了这个分配的内存一段时间,因为分配内存很昂贵。如果进程使用了​​一次最大内存量,则可能再次发生。记忆将逐渐释放,但速度很慢。