2013-03-18 5 views
0

Программа - ЯПутаница с Руби `GC# start`

p RUBY_VERSION 

a = "A" 
b = "B" 

p "#{a}" 
p "#{b}" 

p "Garbage Count => #{GC.count}" 

b = "D" 

p "Garbage Count => #{GC.count}" 

GC.start 

p "Garbage Count => #{GC.count}" 

p "#{a}" 
p "#{b}" 

Выход:

"1.9.3" 
"A" 
"B" 
"Garbage Count => 1" 
"Garbage Count => 1" 
"Garbage Count => 2" 
"A" 
"D" 

В Program I выход p "Garbage Count => #{GC.count}" заставил меня путать которые 1,1,2. Путаница была с подсчетом garbage objects. Поэтому я попробовал модифицированную версию Program-I, как показано ниже.

Где я закомментировал GC.start. Теперь, глядя на вывод Program -II, кажется , как я указал GC.start в моей первой программе, которая, в свою очередь, уничтожила объект без ссылки "B".

Программа - II

p RUBY_VERSION 

a = "A" 
b = "B" 

p "#{a}" 
p "#{b}" 

p "Garbage Count => #{GC.count}" 

b = "D" 

p "Garbage Count => #{GC.count}" 

#GC.start 

p "Garbage Count => #{GC.count}" 

p "#{a}" 
p "#{b}" 

Выход:

"1.9.3" 
"A" 
"B" 
"Garbage Count => 1" 
"Garbage Count => 1" 
"Garbage Count => 1" 
"A" 
"D" 

Заключительные вопросы:

(a) До GC.start 1 объект был удален, что видно на выходе. Что это за объект?

(b) Почему объект без ссылки B не уничтожается без GC.start?

EDIT

p GC.count 
p GC.disable 
p GC.count 

Выход

1 
false 
1 

в abive код, который я отключил garbage collection .Why делает последний GC.count показывает вывод как 1?

Может ли кто-нибудь помочь мне понять вопросы, поднятые на мой взгляд, как указано выше.

ответ

1

GC.count не возвращает количество собранных мусора объектов - он возвращает количество запусков сборщика мусора, поэтому вызов GC.start всегда будет увеличивать его на единицу.

Куча кода выполняется до того, как ваш код начнет работать, поэтому не удивительно, что может произойти сборка мусора.

Отключение gc не собирается отменять коллекции мусора, которые уже произошли.

+0

Просмотреть мой ** EDIT ** –