модуль GC
Модуль GC предоставляет интерфейс к механизму сборки мусора Ruby «помечать-и-сжимать».
Некоторые из базовых методов также доступны через модуль ObjectSpace.
Вы можете получить информацию об операциях GC через GC::Profiler.
Публичные методы класса
Исходный код
# File gc.rb, line 318
def self.config hash = nil
return Primitive.gc_config_get unless hash
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
else
raise ArgumentError
end
end Устанавливает или получает информацию о текущей конфигурации GC.
Параметры конфигурации зависят от реализации GC и могут изменяться без уведомления.
Этот метод можно вызывать без параметров, чтобы получить текущую конфигурацию в виде Hash с Symbol ключами.
Этот метод также можно вызывать с аргументом Hash для присвоения значений допустимым ключам конфигурации. Ключи конфигурации, отсутствующие в переданном Hash, останутся неизменными.
Если пара «ключ-значение» передается в эту функцию и не соответствует допустимому ключу конфигурации для используемой реализации GC, конфигурация не будет обновлена, ключ будет присутствовать в возвращаемом Hash, а его значение будет nil. Это способствует лёгкой миграции между реализациями GC.
В обоих вызовах возвращаемое значение GC.config будет Hash, содержащим последнюю полную конфигурацию, т.е. все ключи и значения, определенные конкретной используемой реализацией GC. В случае обновления конфигурации возвращаемое значение будет включать обновленные новые значения.
Ожидается, что этот метод будет работать только с CRuby.
Независимые от реализации GC значения
Хэш GC.config также может содержать глобальные и только для чтения ключи. Эти ключи не специфичны для какой-либо конкретной реализации библиотеки GC, и попытка записи в них вызовет ArgumentError.
В настоящее время есть только один глобальный ключ только для чтения:
- implementation
-
Возвращает
Stringс именем загруженной библиотеки GC, если она была загружена с помощьюRUBY_GC_LIBRARY, и «default» во всех остальных случаях
Значения, специфичные для реализации GC
Ожидается, что библиотеки GC будут документировать собственную конфигурацию. Допустимые ключи для стандартной реализации GC Ruby:
- rgengc_allow_full_mark
-
Управляет тем, разрешено ли GC запускать полную метку (молодые и старые объекты).
Когда
true, GC чередует главные и второстепенные циклы сбора. Это значение по умолчанию. GC будет работать как ожидается.Когда
false, GC никогда не вызовет цикл полной метки, если он не был явно запрошен кодом пользователя. Вместо этого запустится только второстепенный цикл метки — только молодые объекты будут помечены. Когда место в куче заканчивается, новые страницы будут выделены немедленно вместо запуска полной метки.Флаг будет установлен, чтобы сообщить о том, что была запрошена полная метка. Этот флаг доступен с помощью
GC.latest_gc_info(:needs_major_by).Пользователь может запустить цикл сбора мусора в любое время с помощью
GC.start(full_mark: true)Когда
false, продвижение объектов Молодой->Старый отключено. По соображениям производительности рекомендуется разогреть приложение с помощьюProcess.warmupперед установкой этого параметра наfalse.
Исходный код
# File gc.rb, line 100 def self.count Primitive.gc_count end
Возвращает количество раз, когда GC был вызван с момента запуска процесса.
Исходный код
# File gc.rb, line 66 def self.disable Primitive.gc_disable end
Отключает сборку мусора, возвращая true если сборка мусора была уже отключена.
GC.disable #=> false GC.disable #=> true
Исходный код
# File gc.rb, line 54 def self.enable Primitive.gc_enable end
Включает сборку мусора, возвращая true если сборка мусора была ранее отключена.
GC.disable #=> false GC.enable #=> true GC.enable #=> false
Исходный код
# File gc.rb, line 346
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 Возвращает информацию о последнем цикле сбора мусора.
Если аргумент hash задан и является объектом Hash, он перезаписывается и возвращается. Это предназначено для избежания эффекта пробы.
Если аргумент key задан и является объектом Symbol, он возвращает значение, связанное с ключом. Это эквивалентно GC.latest_gc_info[key].
Исходный код
# File gc.rb, line 376
def self.measure_total_time
Primitive.cexpr! %{
RBOOL(rb_gc_impl_get_measure_total_time(rb_gc_get_objspace()))
}
end Возвращает флаг measure_total_time (по умолчанию: true). Обратите внимание, что измерение может повлиять на производительность приложения.
Исходный код
# File gc.rb, line 364
def self.measure_total_time=(flag)
Primitive.cstmt! %{
rb_gc_impl_set_measure_total_time(rb_gc_get_objspace(), flag);
return flag;
}
end Включает измерение времени GC. Результат можно получить с помощью GC.stat(:time). Обратите внимание, что измерение времени GC может немного снизить производительность.
Исходный код
# File gc.rb, line 35 def self.start full_mark: true, immediate_mark: true, immediate_sweep: true Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false end
Инициализирует сборку мусора, даже если она была отключена вручную.
Ключевой аргумент full_mark определяет, будет ли выполняться цикл основного сбора мусора. Когда он установлен на true, запускается цикл основного сбора мусора, что означает, что все объекты помечены. Когда он установлен на false, запускается цикл второстепенного сбора мусора, что означает, что помечены только молодые объекты.
Ключевой аргумент immediate_mark определяет, будет ли выполняться инкрементальная маркировка. Когда он установлен на true, маркировка завершается во время вызова этого метода. Когда он установлен на false, маркировка выполняется поэтапно, которая чередуется с выполнением кода Ruby, поэтому маркировка может не завершиться во время вызова этого метода. Обратите внимание, что если full_mark — false, то маркировка всегда будет немедленной, независимо от значения immediate_mark.
Ключевой аргумент immediate_sweep определяет, откладывать ли очистку (использовать ленивую очистку). Когда он установлен на false, очистка выполняется поэтапно, которая чередуется с выполнением кода Ruby, поэтому очистка может не завершиться во время вызова этого метода. Когда он установлен на true, очистка завершается во время вызова этого метода.
Примечание: эти ключевые аргументы зависят от реализации и версии. Они не гарантируют совместимость с будущими версиями и могут быть проигнорированы, если основная реализация их не поддерживает.
Исходный код
# File gc.rb, line 184 def self.stat hash_or_key = nil Primitive.gc_stat hash_or_key end
Возвращает Hash, содержащий информацию о сборщике мусора.
Содержимое хэша зависит от реализации и может измениться в будущем без предварительного уведомления.
Хэш включает в себя внутренние статистические данные о сборщике мусора, такие как:
- count
-
Общее количество запусков сборки мусора с момента запуска приложения (количество включает как минорные, так и майорные сборки мусора).
- time
-
Общее время, затраченное на сборку мусора (в миллисекундах).
- heap_allocated_pages
-
Общее количество
:heap_eden_pages+:heap_tomb_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
-
Общее количество страниц, содержащих как минимум один активный слот.
- heap_tomb_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
-
Количество активных, старых объектов, которые пережили как минимум 3 сборки мусора.
- old_objects_limit
-
Когда
:old_objectsпревышает этот лимит, запускается майорая сборка мусора. - oldmalloc_increase_bytes
-
Объем памяти, выделенной в куче для объектов. Уменьшается майорой сборкой мусора.
- oldmalloc_increase_bytes_limit
-
Когда
:oldmalloc_increase_bytesпревышает этот лимит, запускается майорая сборка мусора.
Если в качестве необязательного аргумента задан хэш, он перезаписывается и возвращается. Это сделано для избежания эффекта зондирования.
Ожидается, что этот метод будет работать только в CRuby.
Исходный код
# File gc.rb, line 247 def self.stat_heap heap_name = nil, hash_or_key = nil Primitive.gc_stat_heap heap_name, hash_or_key end
Возвращает информацию о кучах в сборщике мусора.
Если первый необязательный аргумент, heap_name, передан и не nil, он возвращает Hash с информацией об определенной куче. В противном случае он вернет Hash с именами куч в качестве ключей и Hash с информацией о куче в качестве значений.
Если второй необязательный аргумент, hash_or_key, задан как Hash, он будет перезаписан и возвращен. Это сделано для избежания эффекта зондирования.
Если оба необязательных аргумента переданы, и второй необязательный аргумент является символом, он вернет значение Numeric для конкретной кучи.
В CRuby, heap_name имеет тип Integer, но может быть типа String в других реализациях.
Содержимое хэша зависит от реализации и может измениться в будущем без предварительного уведомления.
Если необязательный аргумент, хэш, задан, он перезаписывается и возвращается.
Ожидается, что этот метод будет работать только в CRuby.
Хэш включает следующие ключи с внутренней информацией о сборщике мусора:
- slot_size
-
Размер слота кучи в байтах.
- heap_allocatable_pages
-
Количество страниц, которое можно выделить без запуска нового цикла сборки мусора.
- heap_eden_pages
-
Количество страниц в куче eden.
- heap_eden_slots
-
Общее количество слотов на всех страницах в куче eden.
- heap_tomb_pages
-
Количество страниц в куче tomb. Куча tomb содержит только страницы, не имеющие активных объектов.
- heap_tomb_slots
-
Общее количество слотов на всех страницах в куче tomb.
- total_allocated_pages
-
Общее количество выделенных страниц в куче.
- total_freed_pages
-
Общее количество освобожденных страниц, возвращенных в систему в куче.
- force_major_gc_count
-
Количество раз, когда эта куча запустила цикл майорой сборки мусора из-за отсутствия свободных слотов.
- force_incremental_marking_finish_count
-
Количество раз, когда эта куча запустила завершение инкрементальной маркировки из-за отсутствия пулов слотов.
Исходный код
# File gc.rb, line 74 def self.stress Primitive.gc_stress_get end
Возвращает текущий статус режима стрессовых тестов сборки мусора.
Исходный код
# File gc.rb, line 92 def self.stress=(flag) Primitive.gc_stress_set_m flag end
Обновляет режим стрессовых тестов сборки мусора.
При включенном режиме стрессовых тестов сборщик мусора вызывается при каждой возможности: все выделения памяти и объектов.
Включение режима стрессовых тестов снизит производительность; используется только для отладки.
Флаг может быть true, false или целым числом, битовым OR с следующими флагами:
0x01:: no major GC 0x02:: no immediate sweep 0x04:: full mark after malloc/calloc/realloc
Исходный код
# File gc.rb, line 386
def self.total_time
Primitive.cexpr! %{
ULL2NUM(rb_gc_impl_get_total_time(rb_gc_get_objspace()))
}
end Возвращает измеренное общее время сборки мусора в наносекундах.
Методы экземпляра
Исходный код
# File gc.rb, line 40 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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.