与Ruby的`GC#start`混淆

时间:2013-03-18 12:30:30

标签: ruby ruby-1.9.3

计划 - 我

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

任何人都可以帮助我理解上面提到的问题。

1 个答案:

答案 0 :(得分:1)

GC.count不返回垃圾收集对象的数量 - 它返回垃圾收集器运行的次数,因此调用GC.start将始终将其递增一次。

在代码开始运行之前会执行一堆代码,因此可能会发生一些垃圾收集并不奇怪。

禁用gc不会撤消已经发生的垃圾收集。