2

Pry でガベージ コレクションをいじっていたところ、何らかの理由で機能していないように見えることに気付きました。大きな配列を などに設定するさまざまな方法を試していnilましたが、「なぜ、おかしなメモリの割り当てを解除できないのGC.startですか?」という質問に頭を悩ませていました。

それから IRB に行ったところ、突然機能しました。何が原因なのだろうと思っています。答えがわからないのに見つかった場合は、その方法も知りたいです。

私の単純なコード (私は 1.9.3-p327 を使用していますが、これは 1 ~ 2 ギガを消費することに注意してください):

a = []
for i in (1..1000000)
   a[i] = 'x' * 100
end

ここで、メモリの増加を観察し、その後:

for i in (1..1000000)
   a[i] = i
end

その後、

GC.start
4

1 に答える 1

3

これは、Pry がデフォルトで最後の 100 コマンドの出力を保存するためです。その結果、オブジェクトは引き続き参照され、Pry の出力履歴からオブジェクトをプッシュするのに十分なコマンドが実行されるまで、ガベージ コレクションは行われません。

以下を使用して、現在の Pry インスタンスの出力履歴でオブジェクトを見つけることができるはずです_out_

_out_.to_a

を呼び出すことで、保存された以前の結果のデフォルト数を変更できPry.memory_size=ます~/.pryrc

Pry.memory_size = 1

または実行中の Pry で一時的に (既存のすべての履歴も消去されます):

_pry_.memory_size = 1

これが次のように機能することがわかります。

$ pry
_pry_.memory_size = 100  # default
class C; end

C.new
ObjectSpace.each_object.grep(C).count  #=> 1

GC.start
ObjectSpace.each_object.grep(C).count  #=> 1
$ pry
_pry_.memory_size = 0
class C; end

C.new
ObjectSpace.each_object.grep(C).count  #=> 1

GC.start
ObjectSpace.each_object.grep(C).count  #=> 0
于 2013-07-14T20:47:56.140 に答える