$ 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
内存的其余部分去了哪里以及它为什么没有被垃圾收集器释放?
答案 0 :(得分:0)
Ruby进程并不总是使用生存对象数量所需的确切内存量。它以预定大小的块分配,并在GC之后的某个时间释放块。
请参阅http://www.sitepoint.com/ruby-uses-memory/。
如果使用的对象多于Ruby可以容纳的内存,则必须分配额外的内存。从操作系统请求内存是一项昂贵的操作,因此Ruby尝试不经常这样做。它不是一次要求另外几个KB,而是分配比它需要的更大的块。
...
Ruby保留了这个分配的内存一段时间,因为分配内存很昂贵。如果进程使用了一次最大内存量,则可能再次发生。记忆将逐渐释放,但速度很慢。