我是否在erb中发现了内存泄漏,或者我错过了必要的内容?请指教

时间:2012-05-08 22:29:04

标签: html ruby memory erb

请帮助我理解为什么这个看似简单的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服务器上观察到的复制行为。

1 个答案:

答案 0 :(得分:2)

正如ayckoster建议的那样,“你正在创建文件而从不关闭它们”。使用:

file_contents = File.read(filename)

而不是:

file_contents = File.new(filename).read