【问题标题】:MRI Ruby garbage collector not collecting everything? [duplicate]MRI Ruby 垃圾收集器没有收集所有东西? [复制]
【发布时间】:2016-07-30 22:38:15
【问题描述】:
$ 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

剩余的内存去了哪里,为什么垃圾收集器没有释放它?

【问题讨论】:

  • stackoverflow.com/questions/20385767/… 这[几乎]是同一个问题,原因完全一样。如果您同意我将此问题标记为重复问题,请告诉我。
  • 问题有点不同,但答案完全一样。可以将其标记为重复,但我无法通过 Google 搜索它,因此即使答案相同,它也可以帮助某人通过此标题找到它。似乎简而言之,根本没有办法让 Ruby 释放剩余的内存,它宁愿被杀死。
  • 将问题标记为重复并不会隐藏它。

标签: ruby garbage-collection


【解决方案1】:

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

http://www.sitepoint.com/ruby-uses-memory/

当您使用的对象数量超过 Ruby 的内存容量时,它必须分配额外的内存。从操作系统请求内存是一项昂贵的操作,因此 Ruby 很少尝试这样做。它不是一次请求另外几个 KB,而是分配了一个比它需要的更大的块。

...

Ruby 会保留这个分配的内存一段时间,因为分配内存的成本很高。如果该进程曾经使用过该最大内存量,它可能会再次发生。内存将逐渐释放,但缓慢。

【讨论】:

  • 如果您只有 256MB 或可用内存怎么办? Ruby 会因为无法分配内存而被杀死,还是会在真正需要更多内存的最后一刻释放它?
  • 这听起来像是一个新问题。就像任何使用过多内存的进程一样,它会发生什么取决于您的系统是如何设置的。它可能会开始使用交换内存,或者进程可能会崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多