2

私は理解しようとしていますObjectSpace.each_object
コンソールで:

class Foo; end  
Foo.new  
ObjectSpace.each_object(Foo).count  
=> 1  
GC.start  
ObjectSpace.each_object(Foo).count  
=> 1 

例を見てきましたが、2 番目のカウントは 0 であるべきだとわかってい
ます。
ありがとう。

4

2 に答える 2

1

コンソールによって異なります。

IRB

_明示的に割り当てられていなくても、最後の結果は として保存されます。実行GC.startしても最後のオブジェクトは削除されません:

irb(main):001:0> class Foo; end
=> nil
irb(main):002:0>
irb(main):003:0* Foo.new
=> #<Foo:0x007fca7a309f98>
irb(main):004:0> p ObjectSpace.each_object(Foo).count; GC.start; p ObjectSpace.each_object(Foo).count
1
1
=> 1
irb(main):005:0> p ObjectSpace.each_object(Foo).count; GC.start; p ObjectSpace.each_object(Foo).count
1
0
=> 0

こじ開ける

and を使用して、最後の結果と最後から 2 番目の結果にアクセスでき_ます__

[1] pry(main)> 'a'
=> "a"
[2] pry(main)> 'b'
=> "b"
[3] pry(main)> p _, __
"b"
"a"
=> ["b", "a"]

_out_Pry は、 Pry::HistoryArrayに最後の 100 件の結果をすべて保存します。

[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> Foo.new
=> #<Foo:0x007fd093102118>
[3] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[4] pry(main)> GC.start
=> nil
[5] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[6] pry(main)> _out_[2]
=> #<Foo:0x007fd093102118>

_out_.pop!最後の要素を削除するために使用できます:

[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> Foo.new
=> #<Foo:0x007fa90b1ad360>
[3] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[4] pry(main)> GC.start
=> nil
[5] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[6] pry(main)> 5.times{_out_.pop!}
=> 5
[7] pry(main)> GC.start
=> nil
[8] pry(main)> ObjectSpace.each_object(Foo).count
=> 0

スクリプト内

実行すると:

class Foo; end

Foo.new
p ObjectSpace.each_object(Foo).count

GC.start
p ObjectSpace.each_object(Foo).count

スクリプト内では、次のようになります。

1
0
于 2016-12-17T12:32:40.537 に答える
0

GC.startガベージ コレクタを強制的に開始しません。

ドキュメントからは少しわかりにくいですが、エンジンにガベージ コレクションをスケジュールするように指示するだけです。GC.startとは言っても、ヒープからオブジェクトをすぐに削除することに頼ることはできません。

于 2016-12-17T15:24:53.470 に答える