【问题标题】:GC.start has no effect in Pry, but does in IRBGC.start 在 Pry 中无效,但在 IRB 中有效
【发布时间】:2013-07-14 20:22:20
【问题描述】:

我在 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

【问题讨论】:

  • 由于某种原因,在我写这篇文章的时候,我成功地让 GC.start 实际上解除了分配。现在我再试一次,它什么也没做。 Ruby的魔法……

标签: ruby memory-management garbage-collection pry


【解决方案1】:

这是因为Pry stores the output of the last 100 commands by default。因此,您的对象仍然被引用并且不会被垃圾回收,直到运行了足够多的命令将其从 Pry 的输出历史记录中推出。

您应该能够使用_out_在当前 Pry 实例的输出历史记录中找到您的对象:

_out_.to_a

您可以通过在~/.pryrc 中调用Pry.memory_size= 来更改以前保存的默认结果数量:

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

【讨论】:

  • 而且,在进程级别,内存没有被释放。它只是在“内部”释放。我可以在任务管理器中观察到这一点。
  • @valk 不确定您的意思。该对象是垃圾收集的,其他任何事情都与 Pry 无关,而 Ruby 就是这样做的。查看我的更新。
  • 好的,我需要将问题标记为:为什么运行 Pry 的 Ruby 进程不会释放内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2021-03-04
  • 2015-07-21
  • 2015-08-03
  • 2015-11-13
相关资源
最近更新 更多