ObjectSpace - что это такое и как люди его используют?

Ruby-doc имеет это описание:

Модуль ObjectSpace содержит ряд подпрограмм, которые взаимодействуют со средством сбора мусора и позволяют обходить все живые объекты с помощью итератора.

ObjectSpace также обеспечивает поддержку финализаторов объектов, процедур, которые будут вызываться, когда определенный объект собирается уничтожить сборщиком мусора.

Может кто-нибудь объяснить это на более простом языке, если нет, по крайней мере, предоставить информацию о том, где это используется?

3 ответа

Решение

Сборщик мусора - это конструкция на языках с управляемой памятью. Это то, что управляет памятью. По сути, сборщик мусора должен выяснить, когда выделенная часть памяти больше не нужна, и освободить ее.

Когда вы используете язык со сборщиком мусора, вы можете захотеть сделать несколько вещей:

  1. Запускайте метод всякий раз, когда освобождается часть памяти
  2. Подсчитать все экземпляры класса, которые в настоящее время занимают память
  3. Подсчитать все экземпляры всех классов

ObjectSpace дает вам доступ к таким вещам. По сути, это способ получить доступ ко всему, что в настоящее время использует выделенную память.

Например, чтобы посчитать количество экземпляров некоторого класса:

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

Я знаю о переменных класса, но это только пример использования. Это может быть полезно каждый раз, когда вы хотите выполнить какое-либо действие в каждом экземпляре класса.

Реальное использование ObjectSpace это получить полную иерархию классов исключений.

Другие вопросы по тегам