【问题标题】:How to destroy Ruby object?如何销毁 Ruby 对象?
【发布时间】:2013-10-22 16:11:36
【问题描述】:

假设有一个简单的对象,比如:

object = Object.new

据我所知,这会在内存 (RAM) 中创建对象。

有没有办法从 RAM 中删除这个对象?

【问题讨论】:

  • Ruby 在托管内存环境中运行;垃圾收集器的工作就是为你做这件事。

标签: ruby object


【解决方案1】:

除了破解底层 C 代码之外,没有。垃圾收集由运行时管理,因此您不必担心。这是关于 Ruby 2.0 算法的不错的reference

一旦内存中不再引用该对象,垃圾收集器就会开始工作。你应该没事。

【讨论】:

  • 对于其他查看此内容的人,您将无法简单地执行 object = nil 来清除内存。即 GC 不会等待您执行 object = nil 然后立即释放内存。它会按照自己的方式进行。
【解决方案2】:

简单的答案是,让 GC(垃圾收集器)完成它的工作。

当您准备好摆脱该引用时,只需执行object = nil。并且不要引用object

垃圾收集器最终会收集它并清除引用。

(from ruby site)
=== Implementation from GC
------------------------------------------------------------------------------
  GC.start                     -> nil
  GC.start(full_mark: true, immediate_sweep: true)           -> nil

------------------------------------------------------------------------------

Initiates garbage collection, unless manually disabled.

This method is defined with keyword arguments that default to true:

  def GC.start(full_mark: true, immediate_sweep: true); end

Use full_mark: false to perform a minor GC. Use immediate_sweep: false to
defer sweeping (use lazy sweep).

Note: These keyword arguments are implementation and version dependent. They
are not guaranteed to be future-compatible, and may be ignored if the
underlying implementation does not support them.

【讨论】:

    【解决方案3】:

    Ruby 自动管理垃圾收集

    在大多数情况下,Ruby 会自动处理垃圾收集。当然,有一些边缘情况,但在一般情况下,您永远不必担心典型 Rub​​y 应用程序中的垃圾收集。

    垃圾收集的实现细节在不同版本的 Ruby 中有所不同,但它只暴露了很少的旋钮,而且在大多数情况下你不需要它们。如果您发现自己面临内存压力,您可能需要重新评估您的设计决策,而不是尝试管理内存消耗过多的症状

    手动触发垃圾回收

    一般来说,当对象超出范围或不再被引用时,Ruby 会将对象标记为垃圾回收。但是,某些对象(例如 Symbols)永远不会被收集,并且会在程序的整个运行时持续存在。

    您可以使用GC#start 手动触发垃圾回收,但不能像在 Ruby 中使用 C 程序那样真正释放内存块。如果您发现自己需要这样做,您可能希望解决底层 X/Y 问题,而不是尝试直接管理内存。

    【讨论】:

    • 我没有内存压力,只是想知道 Ruby 是如何工作的。
    【解决方案4】:

    您不能显式销毁对象。 Ruby 具有自动内存管理功能。不再从任何地方引用的对象由解释器中内置的垃圾收集器自动收集。

    关于如何明智地进行分配的好文章,以及一些可用于微调的工具。

    http://merbist.com/2010/07/29/object-allocation-why-you-should-care/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2012-05-02
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2012-02-06
      相关资源
      最近更新 更多