问题 ObjectSpace - 它是什么以及人们如何使用它?


Ruby-doc有这样的描述:

ObjectSpace模块包含一个   与之交互的例程数量   垃圾收集设施和   让你遍历所有生活   具有迭代器的对象。

ObjectSpace还提供支持   对象终结者,将会是   在特定对象的时候调用   被垃圾收集破坏。

任何人都可以用更简单的语言解释这一点,如果没有,至少提供有关使用它的地方的信息?


1715
2018-02-25 09:08


起源



答案:


一个 垃圾收集器 是一种带有托管内存的语言结构。这是管理记忆的事情。从本质上讲,垃圾收集器的工作是确定何时不再需要已分配的内存,并释放它。

当您使用带垃圾收集器的语言时,您可能需要执行以下某些操作:

  1. 每当释放一块内存时运行一个方法
  2. 计算当前占用内存的类的所有实例
  3. 计算所有类的所有实例

ObjectSpace使您可以访问这种性质的东西。从本质上讲,它是一种访问任何当前使用已分配内存的东西的方法。


7
2018-02-25 09:40





例如,要计算某些类的实例数:

class Examp
  def self.obj_count
    count = 0
    ObjectSpace.each_object(self) do |b|
      count += 1
    end

    return count
  end
end

a = Examp.new
b = Examp.new
c = Examp.new

puts Examp.obj_count #=> 3

我知道类变量,它只是用法的一个例子。每次要对类的每个实例执行某些操作时,它都很有用。


6
2018-02-25 09:34



嗨,谢谢你的回答。你是否也碰巧知道这个的实际用法? /好奇 - RubyKumar
37signals.com/svn/posts/2742-the-road-to-faster-tests - demas


答案:


一个 垃圾收集器 是一种带有托管内存的语言结构。这是管理记忆的事情。从本质上讲,垃圾收集器的工作是确定何时不再需要已分配的内存,并释放它。

当您使用带垃圾收集器的语言时,您可能需要执行以下某些操作:

  1. 每当释放一块内存时运行一个方法
  2. 计算当前占用内存的类的所有实例
  3. 计算所有类的所有实例

ObjectSpace使您可以访问这种性质的东西。从本质上讲,它是一种访问任何当前使用已分配内存的东西的方法。


7
2018-02-25 09:40





例如,要计算某些类的实例数:

class Examp
  def self.obj_count
    count = 0
    ObjectSpace.each_object(self) do |b|
      count += 1
    end

    return count
  end
end

a = Examp.new
b = Examp.new
c = Examp.new

puts Examp.obj_count #=> 3

我知道类变量,它只是用法的一个例子。每次要对类的每个实例执行某些操作时,它都很有用。


6
2018-02-25 09:34



嗨,谢谢你的回答。你是否也碰巧知道这个的实际用法? /好奇 - RubyKumar
37signals.com/svn/posts/2742-the-road-to-faster-tests - demas


真实世界的用法 ObjectSpace 是的 派生Exceptions的完整类层次结构


2
2018-02-25 17:03