0

程序 - 我

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,2garbage objectsProgram-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.start1 个对象被销毁之前,从输出中可以清楚地看到。那是什么物体?

(b) 为什么没有引用的对象B没有被销毁GC.start

编辑

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

输出

1
false
1

在我禁用的 abive 代码中。garbage collection为什么最后一个GC.count显示输出为1

任何人都可以帮助我理解如上所述在我脑海中提出的问题。

4

1 回答 1

1

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

在您的代码开始运行之前会执行一堆代码,因此可能会发生一些垃圾收集也就不足为奇了。

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

于 2013-03-18T13:23:11.443 回答