Spec-Zone.ru › Ruby 4.0

модуль GC

Модуль GC предоставляет интерфейс к механизму сборки мусора Ruby с алгоритмом пометки и очистки.

Некоторые низкоуровневые методы также доступны через модуль ObjectSpace.

Получить информацию о работе GC можно с помощью GC::Profiler.

Открытые методы класса

config → hash Показать исходный код
config(hash_to_merge) → hash
# File gc.rb, line 444
def self.config hash = nil
  if Primitive.cexpr!("RBOOL(RB_TYPE_P(hash, T_HASH))")
    if hash.include?(:implementation)
      raise ArgumentError, 'Attempting to set read-only key "Implementation"'
    end

    Primitive.gc_config_set hash
  elsif hash != nil
    raise ArgumentError
  end

  Primitive.gc_config_get
end

Этот метод специфичен для реализации CRuby.

Задаёт или получает информацию о текущей конфигурации GC.

Параметры конфигурации зависят от реализации GC и могут измениться без предупреждения.

Если аргумент не указан, возвращает хеш с конфигурацией:

GC.config
# => {rgengc_allow_full_mark: true, implementation: "default"}

Если указан аргумент hash_to_merge, объединяет этот хеш с сохранённым хешем конфигурации; игнорирует неизвестные ключи хеша; возвращает хеш конфигурации:

GC.config(rgengc_allow_full_mark: false)
# => {rgengc_allow_full_mark: false, implementation: "default"}
GC.config(foo: 'bar')
# => {rgengc_allow_full_mark: false, implementation: "default"}

Конфигурация для всех реализаций

Единственная доступная только для чтения запись для всех реализаций:

  • :implementation: строковое название реализации; для реализации Ruby по умолчанию — 'default'.

Конфигурация для конкретной реализации

Каждая реализация GC поддерживает собственную конфигурацию.

Для реализации Ruby по умолчанию предусмотрена единственная запись:

  • :rgengc_allow_full_mark: определяет, разрешено ли GC выполнять полную пометку (молодых и старых объектов):

    • true (по умолчанию): GC чередует полные и частичные сборки мусора. Устанавливается флаг, уведомляющий GC о запросе на полную пометку. Этот флаг доступен через GC.latest_gc_info(:need_major_by).

    • false: GC не запускает цикл полной пометки, если только это явно не указано в коде пользователя; см. GC.start. Если установить этому параметру значение false, продвижение молодых объектов в старые отключается. Для повышения производительности рекомендуется прогреть приложение с помощью Process.warmup перед тем, как установить этому параметру значение false.

count → integer Показать исходный код
# File gc.rb, line 124
def self.count
  Primitive.gc_count
end

Возвращает общее количество выполненных сборок мусора:

GC.count # => 385
GC.start
GC.count # => 386
disable → true or false Показать исходный код
# File gc.rb, line 76
def self.disable
  Primitive.gc_disable
end

Отключает сборку мусора (но GC.start по-прежнему работает): возвращает информацию о том, была ли сборка мусора уже отключена.

GC.enable
GC.disable # => false
GC.disable # => true
enable → true or false Показать исходный код
# File gc.rb, line 62
def self.enable
  Primitive.gc_enable
end

Включает сборку мусора; возвращает информацию о том, была ли сборка мусора отключена:

GC.disable
GC.enable # => true
GC.enable # => false
latest_gc_info → new_hash Показать исходный код
latest_gc_info(key) → value
latest_gc_info(hash) → hash
# File gc.rb, line 500
def self.latest_gc_info hash_or_key = nil
  if hash_or_key == nil
    hash_or_key = {}
  elsif Primitive.cexpr!("RBOOL(!SYMBOL_P(hash_or_key) && !RB_TYPE_P(hash_or_key, T_HASH))")
    raise TypeError, "non-hash or symbol given"
  end

  Primitive.cstmt! %{
    return rb_gc_latest_gc_info(hash_or_key);
  }
end

Если аргумент не указан, возвращает информацию о последней сборке мусора:

GC.latest_gc_info
# =>
{major_by: :force,
 need_major_by: nil,
 gc_by: :method,
 have_finalizer: false,
 immediate_sweep: true,
 state: :none,
 weak_references_count: 0,
 retained_weak_references_count: 0}

Если указан символьный аргумент key, возвращает значение для этого ключа:

GC.latest_gc_info(:gc_by) # => :newobj

Если указан аргумент-хеш hash, возвращает этот хеш, дополнив его содержимое информацией GC; эта форма может быть полезна для уменьшения эффекта наблюдателя:

h = {foo: 0, bar: 1}
GC.latest_gc_info(h)
# =>
{foo: 0,
 bar: 1,
 major_by: nil,
 need_major_by: nil,
 gc_by: :newobj,
 have_finalizer: false,
 immediate_sweep: false,
 state: :sweeping,
 weak_references_count: 0,
 retained_weak_references_count: 0}
measure_total_time → true or false Показать исходный код
# File gc.rb, line 549
def self.measure_total_time
  Primitive.cexpr! %{
    RBOOL(rb_gc_impl_get_measure_total_time(rb_gc_get_objspace()))
  }
end

Возвращает настройку измерения общего времени GC; начальное значение — true. См. GC.total_time.

measure_total_time = setting → setting Показать исходный код
# File gc.rb, line 536
def self.measure_total_time=(flag)
  Primitive.cstmt! %{
    rb_gc_impl_set_measure_total_time(rb_gc_get_objspace(), flag);
    return flag;
  }
end

Включает или отключает измерение общего времени GC; возвращает setting. См. GC.total_time.

Если аргумент object имеет значение nil или false, измерение общего времени отключается; GC.measure_total_time тогда возвращает false:

GC.measure_total_time = nil   # => nil
GC.measure_total_time         # => false
GC.measure_total_time = false # => false
GC.measure_total_time         # => false

В противном случае измерение общего времени включается; GC.measure_total_time тогда возвращает true:

GC.measure_total_time = true # => true
GC.measure_total_time        # => true
GC.measure_total_time = :foo # => :foo
GC.measure_total_time        # => true

Обратите внимание: включённое измерение общего времени влияет на производительность.

start (full_mark: true, immediate_mark: true, immediate_sweep: true) Показать исходный код
# File gc.rb, line 43
def self.start full_mark: true, immediate_mark: true, immediate_sweep: true
  Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false
end

Запускает сборку мусора, даже если она была явно отключена методом GC.disable.

Именованные аргументы:

  • full_mark: логическое значение определяет, выполнять ли полный цикл сборки мусора:

    • true: запускает полный цикл сборки мусора, то есть помечаются все объекты (старые и новые).

    • false: запускает частичный цикл сборки мусора, то есть помечаются только молодые объекты.

  • immediate_mark: логическое значение определяет, выполнять ли инкрементальную пометку:

    • true: пометка завершается до возврата метода.

    • false: пометка выполняется частями, чередуясь с выполнением программы как до возврата метода, так и после него; поэтому к моменту возврата пометка может быть не завершена. Обратите внимание: если full_mark имеет значение false, пометка всегда выполняется немедленно независимо от значения immediate_mark.

  • immediate_sweep: логическое значение определяет, откладывать ли очистку (используя отложенную очистку):

    • true: очистка завершается до возврата метода.

    • false: очистка выполняется частями, чередуясь с выполнением программы как до возврата метода, так и после него; поэтому к моменту возврата очистка может быть не завершена.

Обратите внимание: эти именованные аргументы зависят от реализации и версии, их совместимость с будущими версиями не гарантируется, и некоторые реализации могут их игнорировать.

stat → new_hash Показать исходный код
stat(key) → value
stat(hash) → hash
# File gc.rb, line 250
def self.stat hash_or_key = nil
  Primitive.gc_stat hash_or_key
end

Этот метод специфичен для реализации CRuby.

Возвращает статистику GC. Конкретные статистические данные зависят от реализации и могут измениться в будущем без предупреждения.

Если аргумент не указан, возвращает информацию о последней сборке мусора:

GC.stat
# =>
{count: 28,
 time: 1,
 marking_time: 1,
 sweeping_time: 0,
 heap_allocated_pages: 521,
 heap_empty_pages: 0,
 heap_allocatable_slots: 0,
 heap_available_slots: 539590,
 heap_live_slots: 422243,
 heap_free_slots: 117347,
 heap_final_slots: 0,
 heap_marked_slots: 264877,
 heap_eden_pages: 521,
 total_allocated_pages: 521,
 total_freed_pages: 0,
 total_allocated_objects: 2246376,
 total_freed_objects: 1824133,
 malloc_increase_bytes: 50982,
 malloc_increase_bytes_limit: 18535172,
 minor_gc_count: 18,
 major_gc_count: 10,
 compact_count: 0,
 read_barrier_faults: 0,
 total_moved_objects: 0,
 remembered_wb_unprotected_objects: 0,
 remembered_wb_unprotected_objects_limit: 2162,
 old_objects: 216365,
 old_objects_limit: 432540,
 oldmalloc_increase_bytes: 1654232,
 oldmalloc_increase_bytes_limit: 16846103}

Если указан символьный аргумент key, возвращает значение для этого ключа:

GC.stat(:count) # => 30

Если указан аргумент-хеш hash, возвращает этот хеш, дополнив его содержимое статистикой GC; эта форма может быть полезна для уменьшения эффекта наблюдателя:

h = {foo: 0, bar: 1}
GC.stat(h)
h.keys.take(5) # => [:foo, :bar, :count, :time, :marking_time]

Хеш содержит, помимо прочего, следующие записи:

  • :count: общее количество сборок мусора, выполненных с момента запуска приложения (учитываются как частичные, так и полные сборки мусора).

  • :time: общее время, затраченное на сборку мусора (в миллисекундах).

  • :heap_allocated_pages: общее количество выделенных страниц.

  • :heap_empty_pages: количество страниц, на которых нет живых объектов и которые можно освободить для системы.

  • :heap_sorted_length: количество страниц, помещающихся в буфер, содержащий ссылки на все страницы.

  • :heap_allocatable_pages: общее количество страниц, которые приложение может выделить без дополнительной сборки мусора.

  • :heap_available_slots: общее количество слотов во всех :heap_allocated_pages.

  • :heap_live_slots: общее количество слотов, содержащих живые объекты.

  • :heap_free_slots: общее количество слотов, не содержащих живые объекты.

  • :heap_final_slots: общее количество слотов с ожидающими выполнения финализаторами.

  • :heap_marked_slots: общее количество объектов, помеченных во время последней сборки мусора.

  • :heap_eden_pages: общее количество страниц, содержащих хотя бы один живой слот.

  • :total_allocated_pages: накопленное количество страниц, выделенных с момента запуска приложения.

  • :total_freed_pages: накопленное количество страниц, освобождённых с момента запуска приложения.

  • :total_allocated_objects: накопленное количество объектов, выделенных с момента запуска приложения.

  • :total_freed_objects: накопленное количество объектов, освобождённых с момента запуска приложения.

  • :malloc_increase_bytes: объём памяти, выделенной в куче для объектов. Уменьшается при каждой сборке мусора.

  • :malloc_increase_bytes_limit: при превышении этого предела значением :malloc_increase_bytes запускается сборка мусора.

  • :minor_gc_count: общее количество частичных сборок мусора, выполненных с момента запуска процесса.

  • :major_gc_count: общее количество полных сборок мусора, выполненных с момента запуска процесса.

  • :compact_count: общее количество уплотнений, выполненных с момента запуска процесса.

  • :read_barrier_faults: общее количество срабатываний барьера чтения во время уплотнения.

  • :total_moved_objects: общее количество объектов, перемещённых при уплотнении.

  • :remembered_wb_unprotected_objects: общее количество объектов без барьеров записи.

  • :remembered_wb_unprotected_objects_limit: при превышении этого предела значением :remembered_wb_unprotected_objects запускается полная сборка мусора.

  • :old_objects: количество живых старых объектов, переживших не менее трёх сборок мусора.

  • :old_objects_limit: при превышении этого предела значением :old_objects запускается полная сборка мусора.

  • :oldmalloc_increase_bytes: объём памяти, выделенной в куче для объектов. Уменьшается при полной сборке мусора.

  • :oldmalloc_increase_bytes_limit: при превышении этого предела значением :oldmalloc_increase_bytes запускается полная сборка мусора.

stat_heap → new_hash Показать исходный код
stat_heap(heap_id) → new_hash
stat_heap(heap_id, key) → value
stat_heap(nil, hash) → hash
stat_heap(heap_id, hash) → hash
# File gc.rb, line 389
def self.stat_heap heap_name = nil, hash_or_key = nil
  Primitive.gc_stat_heap heap_name, hash_or_key
end

Этот метод специфичен для реализации CRuby.

Возвращает статистику куч GC. Конкретные статистические данные зависят от реализации и могут измениться в будущем без предупреждения.

Если аргумент не указан, возвращает статистику для всех куч:

GC.stat_heap
# =>
{0 =>
  {slot_size: 40,
   heap_eden_pages: 246,
   heap_eden_slots: 402802,
   total_allocated_pages: 246,
   force_major_gc_count: 2,
   force_incremental_marking_finish_count: 1,
   total_allocated_objects: 33867152,
   total_freed_objects: 33520523},
 1 =>
  {slot_size: 80,
   heap_eden_pages: 84,
   heap_eden_slots: 68746,
   total_allocated_pages: 84,
   force_major_gc_count: 1,
   force_incremental_marking_finish_count: 4,
   total_allocated_objects: 147491,
   total_freed_objects: 90699},
 2 =>
  {slot_size: 160,
   heap_eden_pages: 157,
   heap_eden_slots: 64182,
   total_allocated_pages: 157,
   force_major_gc_count: 0,
   force_incremental_marking_finish_count: 0,
   total_allocated_objects: 211460,
   total_freed_objects: 190075},
 3 =>
  {slot_size: 320,
   heap_eden_pages: 8,
   heap_eden_slots: 1631,
   total_allocated_pages: 8,
   force_major_gc_count: 0,
   force_incremental_marking_finish_count: 0,
   total_allocated_objects: 1422,
   total_freed_objects: 700},
 4 =>
  {slot_size: 640,
   heap_eden_pages: 16,
   heap_eden_slots: 1628,
   total_allocated_pages: 16,
   force_major_gc_count: 0,
   force_incremental_marking_finish_count: 0,
   total_allocated_objects: 1230,
   total_freed_objects: 309}}

В примере выше ключи внешнего хеша — это идентификаторы куч:

GC.stat_heap.keys # => [0, 1, 2, 3, 4]

В CRuby каждый идентификатор кучи является целым числом; в других реализациях идентификатор кучи может быть строкой.

Если указан только аргумент heap_id, возвращает статистику для указанного идентификатора кучи:

GC.stat_heap(2)
# =>
{slot_size: 160,
 heap_eden_pages: 157,
 heap_eden_slots: 64182,
 total_allocated_pages: 157,
 force_major_gc_count: 0,
 force_incremental_marking_finish_count: 0,
 total_allocated_objects: 225018,
 total_freed_objects: 206647}

Если указаны аргументы heap_id и key, возвращает значение заданного ключа для указанной кучи:

GC.stat_heap(2, :slot_size) # => 160

Если указаны аргументы nil и hash, объединяет статистику всех куч с указанным хешем:

h = {foo: 0, bar: 1}
GC.stat_heap(nil, h).keys # => [:foo, :bar, 0, 1, 2, 3, 4]

Если указаны аргументы heap_id и hash, объединяет статистику указанной кучи с указанным хешем:

h = {foo: 0, bar: 1}
GC.stat_heap(2, h).keys
# =>
[:foo,
 :bar,
 :slot_size,
 :heap_eden_pages,
 :heap_eden_slots,
 :total_allocated_pages,
 :force_major_gc_count,
 :force_incremental_marking_finish_count,
 :total_allocated_objects,
 :total_freed_objects]

Статистика кучи может включать:

  • :slot_size: размер слота кучи в байтах.

  • :heap_allocatable_pages: количество страниц, которые можно выделить без запуска нового цикла сборки мусора.

  • :heap_eden_pages: количество страниц в куче eden.

  • :heap_eden_slots: общее количество слотов на всех страницах кучи eden.

  • :total_allocated_pages: общее количество страниц, выделенных в куче.

  • :total_freed_pages: общее количество страниц, освобождённых и возвращённых системе в куче.

  • :force_major_gc_count: количество запусков принудительных полных циклов сборки мусора этой кучей из-за нехватки свободных слотов.

  • :force_incremental_marking_finish_count: количество случаев, когда эта куча принудительно завершала инкрементальную пометку из-за нехватки слотов в пуле.

stress → setting Показать исходный код
# File gc.rb, line 87
def self.stress
  Primitive.gc_stress_get
end

Возвращает текущую настройку режима стресс-тестирования GC, изначально равную false.

Режим стресс-тестирования можно настроить с помощью метода GC.stress=.

stress = value → value Показать исходный код
# File gc.rb, line 111
def self.stress=(flag)
  Primitive.gc_stress_set_m flag
end

Включает или отключает режим стресс-тестирования; его включение снижает производительность, поэтому он предназначен только для отладки.

Устанавливает текущее значение режима стресс-тестирования GC:

  • Если значение равно nil или false, режим стресс-тестирования отключается.

  • Если значение является целым числом, режим стресс-тестирования включается с указанными флагами; см. ниже.

  • В противном случае режим стресс-тестирования включается; GC запускается при каждой возможности сборки мусора: при выделении памяти и объектов.

Флаги — это биты указанного целого числа:

  • 0x01: без полной сборки мусора.

  • 0x02: без немедленной очистки.

  • 0x04: полная пометка после malloc/calloc/realloc.

total_time → integer Показать исходный код
# File gc.rb, line 585
def self.total_time
  Primitive.cexpr! %{
    ULL2NUM(rb_gc_impl_get_total_time(rb_gc_get_objspace()))
  }
end

Возвращает общее время GC в наносекундах:

GC.total_time # => 156250

Обратите внимание: общее время накапливается только при включённом измерении общего времени (то есть когда GC.measure_total_time имеет значение true):

GC.measure_total_time # => true
GC.total_time # => 625000
GC.start
GC.total_time # => 937500
GC.start
GC.total_time # => 1093750

GC.measure_total_time = false
GC.total_time # => 1250000
GC.start
GC.total_time # => 1250000
GC.start
GC.total_time # => 1250000

GC.measure_total_time = true
GC.total_time # => 1250000
GC.start
GC.total_time # => 1406250

Открытые методы экземпляра

garbage_collect (full_mark: true, immediate_mark: true, immediate_sweep: true) Показать исходный код
# File gc.rb, line 48
def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true
  Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false
end

Псевдоним для GC.start

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API