计划 - 我
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
销毁?
修改 的
p GC.count
p GC.disable
p GC.count
输出
1
false
1
在我已禁用{1}}的abive代码中。为什么最后garbage collection
将输出显示为GC.count
?
任何人都可以帮助我理解上面提到的问题。
答案 0 :(得分:1)
GC.count不返回垃圾收集对象的数量 - 它返回垃圾收集器运行的次数,因此调用GC.start
将始终将其递增一次。
在代码开始运行之前会执行一堆代码,因此可能会发生一些垃圾收集并不奇怪。
禁用gc不会撤消已经发生的垃圾收集。