この一見単純な erb レンダリング ループのメモリが永遠にサイズが大きくなる理由を理解するのを手伝ってください。
「alltext.erb」は、次のような基本的なテキスト ファイルです。
<% 5000000.times do %>
spam
<% end %>
以下のテスト ケースは、最終的に最大 670 MB になるまでメモリ内で増加します。
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サーバーで観察された動作を複製しています.