请帮助我理解为什么这个看似简单的erb渲染循环的记忆会永远增长。
“alltext.erb”是一个基本的文本文件,如下所示:
<% 5000000.times do %>
spam
<% end %>
下面的测试用例在内存中增长,直到它最终达到~670MB
require 'erb'
filename = File.expand_path("../alltext.erb", __FILE__)
file_contents = File.read(filename)
renderer = ERB.new(file_contents)
# Undiagnosed memory leak below...
loop do
html = renderer.result();
# Display memory in kb
puts `ps -o rss= -p #{Process.pid}`.to_i
# Attempt to clear variables and force garbage collection
html = nil
filename = nil
file_contents = nil
renderer = nil
GC.start
# Display memory in kb
puts `ps -o rss= -p #{Process.pid}`.to_i
sleep(5)
end
我希望将所有变量设置为nil并强制进行垃圾收集,以及超出范围(继续进行永久循环的下一次迭代)将释放一些内存。请帮助我理解我在这里缺少的东西。
我的ruby版本是1.9.2-p180。 我在OSX上,但这是测试用例是在当前的Ubuntu服务器上观察到的复制行为。
答案 0 :(得分:2)
正如ayckoster建议的那样,“你正在创建文件而从不关闭它们”。使用:
file_contents = File.read(filename)
而不是:
file_contents = File.new(filename).read