2016-04-09 10 views
0
$ ruby -v 
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] 
$ irb 

メモリの使用が開始されます:今56メガバイトMRI Rubyガベージコレクタはすべてを収集していませんか?右IRB後

>> a = [] 
>> 1000.times { a << (1..50000).to_a.map { |i| "abc" }.join } 
>> a = nil 

メモリ使用量:244メガバイト(予想通り)

>> GC.start 

メモリ使用量になりました:146メガバイト

メモリの残りの部分はなぜガベージコレクタによって解放されていないのですか?

+2

http://stackoverflow.com/questions/20385767/finding-the-cause-of-a-memory-leak-in-ruby/20608455#20608455これは[ほとんど]同じ問題で、原因はまったく同じです。この質問を重複しているとマークしても問題ないかどうか教えてください。 – mudasobwa

+0

質問は少し異なりますが、答えはまったく同じです。重複としてマークするのはいいですが、Googleにはできませんでしたので、答えが同じであっても、このタイトルで誰かを見つけるのに役立つかもしれません。簡単に言えば、Rubyに残りのメモリを解放させる方法はなく、むしろ殺されるだろう。 – Sergey

+0

質問を重複としてマークしても、質問は隠されません。 – mudasobwa

答えて

0

Rubyプロセスは、常に生きているオブジェクトの数に必要な正確な量のメモリを使用するだけではありません。所定のサイズのチャンクに割り当てられ、GCの後にチャンクを解放します。

http://www.sitepoint.com/ruby-uses-memory/を参照してください。

Rubyより多くのオブジェクトが使用されている場合は、メモリに追加する必要があります。オペレーティングシステムからメモリを要求するのはコストのかかる操作なので、Rubyはそれをあまり頻繁にやろうとしません。一度に別の数KBを要求するのではなく、必要以上に大きなチャンクを割り当てます。メモリを割り当てることは高価であるため

...

Rubyは、しばらくの間、この割り当てられたメモリ上に保持しています。プロセスがその最大量のメモリを一度使用した場合、それは再び起こる可能性があります。メモリは徐々に解放されますが、ゆっくり解放されます。

+0

256MBまたはメモリしか使用できない場合はどうすればよいですか? Rubyはメモリを割り当てることができないという理由でむしろ殺されるのだろうか、それともメモリが本当に必要な最後の瞬間に解放されるのだろうか? – Sergey

+0

新しい質問のようです。あまりにも多くのメモリを使用するプロセスと同様に、プロセスはシステムがどのように設定されているかによって異なります。スワップメモリ​​の使用を開始するか、プロセスがクラッシュする可能性があります。 –

関連する問題