垃圾收集在红宝石中?

时间:2020-11-04 01:46:35

标签: ruby

我可以看到related questions asked before

在某些语言中,有一种强制垃圾收集的特定方法。例如,在R中,我们可以调用gc(),它将释放以前用于存储自删除对象以来的内存。

有没有办法在红宝石中做到这一点?

如果它是相关的,我会运行一个很长的循环,并且我认为它会在每次迭代中慢慢积累一点内存,并且我想每执行100次迭代就强制进行一次垃圾回收,以确保例如(伪代码)if index % 100 == 0 then gc()。还要注意,我打算在Rails应用程序中使用它,尽管我认为这无关紧要(因为垃圾回收将完全是一个红宝石功能,与Rails无关)

2 个答案:

答案 0 :(得分:2)

不,在Ruby中无法做到这一点。

个名为GC::start的方法,文档甚至说:

启动垃圾收集,即使已手动将其禁用。

但这不是事实。从您的代码到运行时,GC::start只是一个建议,对于您的应用程序来说,现在应该安全运行垃圾回收。但这只是一个建议。运行时可以随意忽略此建议。

大多数具有自动内存管理功能的编程语言无法使程序员控制垃圾收集器。

如果Ruby有强制垃圾收集的方法,那么就不可能在JVM上实现Ruby,并且JRuby和TruffleRuby都不存在,就不可能在.NET上实现Ruby,而IronRuby则不存在,不可能在ECMAScript上实现Ruby,而Opal则不存在,不可能使用现有的高性能垃圾收集器来实现Ruby,而RubyOMR则不存在。

由于通常希望使实施者能够自由地实现优化并提高语言的速度,因此语言在指定功能时会非常谨慎,因为这些功能会极大地限制实施者的工作。

我非常惊讶R具有这种功能,特别是因为这意味着不可能以符合语言规范的方式来实现像FastR这样的高性能实现。 FastR比GNU R快35倍以上,因此很明显为什么需要FastR之类的东西存在。但是FastR更快的一种方式是,它使用不允许对垃圾回收进行控制的第三方高性能垃圾收集运行时(无论是GraalVM还是JVM),因此FastR永远不会 是兼容的R实现。

有趣的是,the documentation of gc()这样说:

[T]调用gc的主要目的是为了报告内存使用情况。

答案 1 :(得分:0)

这是通过GC.start完成的。

-