【发布时间】:2015-05-03 19:09:35
【问题描述】:
正如标题,我有一个处理大量数据的 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)
好的,我试过了,我不明白为什么在我做了$big_var=nil和GC.start之后GC.stat[:heap_used]仍然那么大
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
【问题讨论】:
-
向我们展示代码sou
-
我已经放上测试代码了,谢谢关注~~
-
简而言之:你不能。
-
谢谢大家。而现在我知道我无法做到这一点。