请帮助我理解为什么这个看似简单的 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 并强制垃圾收集,以及超出范围(继续进行永久循环的下一次迭代)会释放一些内存。请帮助我了解我在这里缺少什么。
我的红宝石版本是 1.9.2-p180。我在 OSX 上,但这是测试用例复制在当前 Ubuntu 服务器上观察到的行为。