作爲標題,我有一個ruby程序處理大量的數據。該計劃把所有的內存和有系統命令hostname
在裏面, 的主叫和錯誤發生如何強制Ruby釋放內存到操作系統
Cannot allocate memory - hostname
我試過GC.start
,它不工作。
那麼我該如何強制ruby釋放未使用的內存呢?
好的,這是來自其他人的測試代碼,最後的錯誤表明big_var
已被回收。但內存仍未釋放。
require "weakref"
def report
puts "#{param}:\t\t Memory " + `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`
.strip.split.map(&:to_i)[1].to_s + 'KB'
end
big_var = ""
#big_var = WeakRef.new(big_var)
report
big_var = 1_000_000.times.map(&:to_s)
report
big_var = WeakRef.new(big_var)
GC.start
sleep 1
report
p big_var.length
#Memory 7508KB
#Memory 61516KB
#Memory 53700KB
#test.rb:20:in `<main>': Invalid Reference - probably recycled (WeakRef::RefError)
OK,我想事情鬧,我不明白爲什麼GC.stat[:heap_used]
仍是大我沒有$big_var=nil
和GC.start
puts GC.stat[:heap_used]
$big_var = []
5000000.times { |i|
$big_var << i.to_s
}
puts GC.stat[:heap_used]
$big_var = nil
puts GC.stat[:heap_used]
GC.start
puts GC.stat[:heap_used]
#70
#12286
#12286
#9847
此外後,我使用Ruby 2.1和CentOS 6.4
http://ruby-doc.org/stdlib-2.1.2/libdoc/weakref/rdoc/WeakRef.html – 2015-03-03 08:04:20
它不起作用。 – sou 2015-03-03 08:25:44
告訴我們代碼sou – peter 2015-03-03 08:33:45