作为标题,我有一个ruby程序处理大量数据。该程序占用了所有内存,并在其中调用了系统命令hostname
,
并发生错误
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)
好的,我尝试了一些事情,我不明白为什么在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
答案 0 :(得分:2)
我可以看到垃圾收集是由WeakRef
类完成的。这是我试图证明这一点:
require 'objspace'
require "weakref"
big_var = ""
puts "memory size: #{ObjectSpace.memsize_of big_var}"
big_var = 1_000_000.times.map(&:to_s)
puts "memory size: #{ObjectSpace.memsize_of big_var}"
big_var = WeakRef.new(big_var)
GC.start
puts "memory size: #{ObjectSpace.memsize_of big_var}"
输出
[shreyas@arup_ruby (master)]$ ruby a.rb
memory size: 40
memory size: 11636312
memory size: 40
[shreyas@arup_ruby (master)]$
查看方法:memsize_of
。