1

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

4

1 回答 1

2

正如ayckoster 所建议的那样,“您正在创建文件并且永远不会关闭它们”。利用:

file_contents = File.read(filename)

代替:

file_contents = File.new(filename).read
于 2012-05-08T23:35:34.813 回答