Почему этот простой классовый мусор не собирается в консоли Ruby? - PullRequest
0 голосов
/ 28 ноября 2018

Я запускаю несколько тестов с помощью сборщика мусора Ruby.Когда я запускаю его из консоли Ruby, я получаю странное поведение:

class B
end
#=> nil
count = ObjectSpace.each_object(B) {|x| x }
#=> 0
b = B.new
#=> #<B:0x00007feeb7849678>
count = ObjectSpace.each_object(B) {|x| x }
#=> 1
b = nil
#=>  nil
GC.start
#=> nil
count = ObjectSpace.each_object(B) {|x| x }
#=> 1

Почему это происходит?

ОБНОВЛЕНИЕ: Я получаю это поведение только в PRY.В IRB работает как положено (объект является мусором).

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Кажется, на этот вопрос уже ответили на другой вопрос

Pry хранит выходные данные последних 100 команд, и, таким образом, объект не может быть фактически собран мусором.

0 голосов
/ 29 ноября 2018

Сборщик мусора собирает мусор только тогда, когда это абсолютно необходимо.Сбор дорогконкретной реализации и конкретной среды, которую вы используете.Например, у Rubinius совершенно другой GC, чем у YARV, который имеет совершенно другой GC, чем у MRuby.Даже в пределах YARV, GC значительно изменился между версиями.TruffleRuby, JRuby, IronRuby, MagLev и Opal даже не имеют GC, полагаются на управление памятью базовой платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...