ruby - 如何计算 ruby​​ 中某个类的现有实例?

标签 ruby garbage-collection

这是来自 this question 的想法:创建对象后,增加一个类变量。当收集对象时,将其递减。如您所见,终结器被调用,@@no_foo 被递减。但是当我稍后查询时,减量消失了。似乎值(value)只会上升,不会下降(如果我创建两个对象,它将显示 2)。我是否遗漏了一些明显的东西?

class Foo
  @@no_foo = 0

  def initialize
    puts 'creating object'
    @@no_foo += 1
    ObjectSpace.define_finalizer(self, proc { self.delete })
  end

  def delete
    puts 'deleting object'
    @@no_foo # => 1
    @@no_foo -= 1
    @@no_foo # => 0
  end

  def self.no_foo
    @@no_foo # => 0, 1
  end
end

Foo.no_foo # => 0
f = Foo.new
f = nil

GC.start
Foo.no_foo # => 1

# >> creating object
# >> deleting object

最佳答案

它可以工作,但在完成时存在循环引用。您的终结器取决于应收集的对象的绑定(bind)。参见 this solution .

class Foo
  @@no_foo = 0

  def initialize
    @@no_foo += 1
    ObjectSpace.define_finalizer(self, Foo.method(:delete))
  end

  def self.delete id # also this argument seems to be necessary
    @@no_foo -= 1
  end

  def self.no_foo
    @@no_foo
  end
end

Foo.no_foo # => 0
1000.times{Foo.new}
Foo.no_foo # => 1000

GC.start
Foo.no_foo # => 0

关于ruby - 如何计算 ruby​​ 中某个类的现有实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794896/

相关文章:

android - Calabash Android 脚本停止

ruby-on-rails - has_many :through and fields_for 问题

java - 如何在运行时查找堆/堆栈中对象的强引用数

java - 小对象池是否比 Android 的 Java 垃圾收集器更有效?

java - Minor GC 太慢

ruby-on-rails - Rails 授权查询不起作用

Ruby 逻辑运算符

java - 为什么minor GC这么频繁

multithreading - 为什么应用程序会在一个Solaris框中创建31个 “GC task thread”而在另一个Solaris框中仅创建2个

ruby - 在单行代码中枚举 ruby​​ 变量