2013-07-14 3 views
1

Я играл с сборкой мусора в Pry и заметил, что по какой-то причине он не работает. Я пытался разными способами установить свой большой массив как nil и т. Д., Ломая голову на вопрос «почему в мире я просто не могу освободить память от GC.startGC.start не действует в Pry, но делает это в IRB

Затем я отправился в 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 
+0

по какой-то причине, в то время, когда я пишу это, мне удалось сделать GC.start фактически DEALLOCATE. Теперь я снова пытаюсь, и он ничего не делает. Магия Руби ... – valk

ответ

3

Это потому, что Pry stores the output of the last 100 commands by default. В результате ваш объект по-прежнему ссылается и не будет собираться мусором до тех пор, пока не будет выполнено достаточное количество команд, чтобы вытолкнуть его из истории вывода 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 
+0

И все же на уровне процесса память не выделяется. Он освобождается только «внутренне». Я могу наблюдать это в диспетчере задач. – valk

+0

@valk Не уверен, что вы имеете в виду. Объект собирает мусор, все остальное не имеет ничего общего с Pry и что-то делает Ruby. См. Мое обновление. –

+0

Хорошо, мне нужно было обозначить вопрос как: Почему Ruby Process с запущенным Pry не освобождает память. – valk

Смежные вопросы