代码之家  ›  专栏  ›  技术社区  ›  stevec Zxeenu

红宝石中收集垃圾?

  •  0
  • stevec Zxeenu  · 技术社区  · 4 年前

    我能看见 related questions asked before

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

    在ruby中有什么方法可以做到这一点吗?

    如果相关的话,我正在运行一个很长的循环,我认为每次迭代都会慢慢积累一点内存,我想强制每100次迭代左右进行一次垃圾收集,以确保(伪代码) if index % 100 == 0 then gc() 。还要注意,我打算在rails应用程序中使用它,尽管我认为这并不相关(因为垃圾收集完全是ruby的一个功能,与rails无关)

    1 回复  |  直到 4 年前
        1
  •  2
  •   Jörg W Mittag    4 年前

    不,在Ruby中没有办法做到这一点。

    那里 一个名为 GC::start ,文件甚至说:

    启动垃圾回收,即使手动禁用。

    但事实并非如此。 GC::开始 只是一个 咨询的 从代码到运行时 会是 现在,您的应用程序可以安全地运行垃圾回收。但这就是 只有 一个建议。运行时可以自由忽略此建议。

    大多数具有自动内存管理的编程语言都没有让程序员控制垃圾收集器。

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

    由于通常希望给予实现者实现优化的自由并使语言更快,因此语言在指定如此严格限制实现者可以做什么的功能时非常谨慎。

    我很惊讶R有这样的功能,尤其是因为这意味着不可能实现像这样的高性能实现 FastR 以符合语言规范的方式。FastR比GNU R快35以上,所以很明显为什么存在像FastR这样的东西是可取的。但FastR更快的一个方法是,它使用第三方高性能垃圾收集运行时(GraalVM或JVM),不允许控制垃圾收集,因此FastR可以 从未 是一个兼容的R实现。

    有趣的是, the documentation of gc() 有这样一句话:

    [T] 他打电话的主要目的 gc 用于报告内存使用情况。

        2
  •  0
  •   D. SM    4 年前

    这是通过 GC.start .

    --