модуль GC
Модуль GC предоставляет интерфейс к механизму сборки мусора Ruby с алгоритмом пометки и очистки.
Некоторые низкоуровневые методы также доступны через модуль ObjectSpace.
Получить информацию о работе GC можно с помощью GC::Profiler.
Открытые методы класса
# 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.
-
# File gc.rb, line 124 def self.count Primitive.gc_count end
Возвращает общее количество выполненных сборок мусора:
GC.count # => 385 GC.start GC.count # => 386
# File gc.rb, line 76 def self.disable Primitive.gc_disable end
Отключает сборку мусора (но GC.start по-прежнему работает): возвращает информацию о том, была ли сборка мусора уже отключена.
GC.enable GC.disable # => false GC.disable # => true
# File gc.rb, line 62 def self.enable Primitive.gc_enable end
Включает сборку мусора; возвращает информацию о том, была ли сборка мусора отключена:
GC.disable GC.enable # => true GC.enable # => false
# 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}
# 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.
# 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
Обратите внимание: включённое измерение общего времени влияет на производительность.
# 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: очистка выполняется частями, чередуясь с выполнением программы как до возврата метода, так и после него; поэтому к моменту возврата очистка может быть не завершена.
-
Обратите внимание: эти именованные аргументы зависят от реализации и версии, их совместимость с будущими версиями не гарантируется, и некоторые реализации могут их игнорировать.
# 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запускается полная сборка мусора.
# 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: количество случаев, когда эта куча принудительно завершала инкрементальную пометку из-за нехватки слотов в пуле.
# File gc.rb, line 87 def self.stress Primitive.gc_stress_get end
Возвращает текущую настройку режима стресс-тестирования GC, изначально равную false.
Режим стресс-тестирования можно настроить с помощью метода GC.stress=.
# 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.
# 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
Открытые методы экземпляра
# 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.