Helo, 我無法成功如何釋放內存後在哈希鍵刪除。當我從哈希中刪除密鑰時,內存不會被釋放,也不會手動調用GC.start
。這是預期的行爲還是GC在從Hash刪除密鑰並且這些對象泄漏到某處時不釋放內存?我如何刪除Hash中的密鑰並在內存中取消分配?刪除密鑰後紅寶石哈希內存泄漏
實施例:
irb(main):001:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 4748
irb(main):002:0> a = {}
=> {}
irb(main):003:0> 1000000.times{|i| a[i] = "test #{i}"}
=> 1000000
irb(main):004:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 140340
irb(main):005:0> 1000000.times{|i| a.delete(i)}
=> 1000000
irb(main):006:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 140364
irb(main):007:0> GC.start
=> nil
irb(main):008:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 127076
PS:我使用紅寶石1.8.7。我也試過紅寶石1.9.2,但它不是更好。
我不知道,但我想ruby正在彙集那些被重用的內存,這是一個非常標準的做事方式。 – falstro 2011-05-11 18:43:08
如果有人可以複製Adam的代碼,但是顯示重複多次創建和刪除對象不會增加內存使用量,這有助於回答問題。 – 2011-05-11 23:42:32
釋放內存:1000000.times {| i |一個|| = []; a [i.to_s] = i; @ a.delete(ⅰ); GC.start; p ObjectSpace.count_objects} – 2012-10-20 17:50:45