2

我在 Pry 中玩垃圾收集,并注意到由于某种原因它似乎不起作用。我正在尝试不同的方法将我的大数组设置为nil等,同时在“为什么我根本无法释放该死的内存GC.start?”这个问题上打破了我的头脑。

然后我去了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
4

1 回答 1

3

这是因为Pry 默认存储最后 100 个命令的输出。结果,您的对象仍然被引用并且不会被垃圾回收,直到运行了足够的命令以将其从 Pry 的输出历史记录中推出。

您应该能够使用以下命令在当前 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
于 2013-07-14T20:47:56.140 回答