2016-12-17 5 views
2

I'am은 콘솔에서 ObjectSpace.each_object
알아 내려고 .count : 나는 예를 본 적이ObjectSpace.each_object (푸)

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

을 나는 두 번째 카운트가되어야한다고 0
어떤을 알고 아이디어가 여기 무슨 일 이니?
감사합니다.

+0

왜 개수가 0이어야합니까? –

+0

@ Foo.new가 어떤 변수에도 할당되지 않았기 때문에 @ Зелёный : 콘솔에 따라 도달 할 수 없으며 가비지 수집 준비가 될 수 있습니다. –

답변

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 

들어 올립니다을

당신은 마지막 결과 및 ___과 결과를 마지막으로 두 번째에 액세스 할 수 있습니다

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

들어 올립니다 모두 저장 최종 결과는 _out_입니다. Pry :: HistoryArray :

[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> 
를 실행하면 스크립트

내부

[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 

:

당신은 그것의 마지막 요소를 제거하기 위해 _out_.pop!을 사용할 수 있습니다

class Foo; end 

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

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

를 스크립트 내에서, 당신은 얻을 :

1 
0 

+0

_out_에 대한 설명 주셔서 감사합니다! 콘솔과 관련된 느낌이 들었습니다. – Anton

+0

내 기쁨. 실제로'_out_'에 대해 들어 본 적이 없습니다. –

0

GC.start을 강제 실행하지 않으므로 가비지 수집기가 시작됩니다.

문서에서 약간 명확하지 않지만 엔진에 가비지 수집을 지시합니다. 즉, GC.start에 의존 할 수 없기 때문에 즉시 힙에서 오브젝트가 제거됩니다.

+0

나는 그것을 알고있다. 고맙습니다, – Anton