5

私は大きなアレイを作成しましたがa、そのメモリは最大500MBに増加しました。

a = []

t = Thread.new do 
  loop do
    sleep 1
    print "#{a.size} "
  end
end

5_000_000.times do
  a << [rand(36**10).to_s(36)]
end

puts "\n size is #{a.size}"
a = []

t.join

その後、「クリア」aしましたが、プロセスを強制終了するまで、割り当てられたメモリは変更されませんでした。メモリから割り当てられたこれらすべてのデータを削除するために私がする必要がある特別なことはありaますか?

4

2 に答える 2

4

に電話することはできますが、電話をかけGC.start()たくない場合があります。例を参照してください:Stack Overflowに関するここでの議論については、Rubyガベージコレクションを参照してください。基本的に、強制するやむを得ない理由がない限り、ガベージコレクターにいつ実行するかを自分で決定させます。

于 2012-08-11T07:14:23.550 に答える
4

わずかに変更されたバージョンのコードで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バイトの使用で終了した以前のプロファイルの実行よりも大幅に少なくなります。ガベージコレクションは、この実行中にこれが発生しました。これは、に要素を追加する新しいコード行によってトリガーされた可能性があります。

簡単に言えば、いいえです。に割り当てられたデータを削除するために特別なことをする必要はありませんが、これにより、それを証明するためのツールが提供されることを願っています。

于 2012-08-11T20:16:14.913 に答える