わずかに変更されたバージョンのコードでRubyガベージコレクションプロファイラーを使用する場合:
GC::Profiler.enable
GC::Profiler.clear
a = []
5_000_000.times do
a << [rand(36**10).to_s(36)]
end
puts "\n size is #{a.size}"
a = []
GC::Profiler.report
次の出力が得られます(Ruby 1.9.3の場合)(一部の列と行が削除されています):
GC 60 invokes.
Index Invoke Time(sec) Use Size(byte) Total Size(byte) ...
1 0.109 131136 409200 ...
2 0.125 192528 409200 ...
...
58 33.484 199150344 260938656 ...
59 36.000 211394640 260955024 ...
プロファイルは、使用された131 136バイトで始まり、使用された211 394 640バイトで終わります。実行中のどこでもサイズが減少することなく、ガベージコレクションは行われなかったと見なすことができます。
次に、配列aに単一の要素を追加するコード行を追加すると、aが500万要素に成長した後に配置され、空の配列が割り当てられます。
GC::Profiler.enable
GC::Profiler.clear
a = []
5_000_000.times do
a << [rand(36**10).to_s(36)]
end
puts "\n size is #{a.size}"
a = []
# the only change is to add one element to the (now) empty array a
a << [rand(36**10).to_s(36)]
GC::Profiler.report
これにより、プロファイラーの出力が次のように変更されます(一部の列と行が削除されました)。
GC 62 invokes.
Index Invoke Time(sec) Use Size(byte) Total Size(byte) ...
1 0.156 131376 409200 ...
2 0.172 192792 409200 ...
...
59 35.375 211187736 260955024 ...
60 36.625 211395000 469679760 ...
61 41.891 2280168 307832976 ...
このプロファイラーの実行は、131 376バイトの使用で開始し、前の実行と同様に増加しますが、2 280 168バイトの使用で終了し、211394640バイトの使用で終了した以前のプロファイルの実行よりも大幅に少なくなります。ガベージコレクションは、この実行中にこれが発生しました。これは、に要素を追加する新しいコード行によってトリガーされた可能性があります。
簡単に言えば、いいえです。に割り当てられたデータを削除するために特別なことをする必要はありませんが、これにより、それを証明するためのツールが提供されることを願っています。