ObjectSpace.each_object(Foo).count
Я пытаюсь выяснить ObjectSpace.each_object
В консоли:
class Foo; end
Foo.new
ObjectSpace.each_object(Foo).count
=> 1
GC.start
ObjectSpace.each_object(Foo).count
=> 1
Я видел примеры, и я знаю, что второй счет должен быть 0.
Есть идеи, что здесь происходит?
Благодарю.
2 ответа
Это зависит от вашей консоли.
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"]
Прай сохраняет все 100 последних результатов в _out_
Отделить::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>
Ты можешь использовать _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
GC.start
не заставляет запускать сборщик мусора.
Это немного неясно из документации, но он просто инструктирует движок планировать сборку мусора. Тем не менее, нельзя полагаться на GC.start
немедленно удалит объекты из кучи.