Spec-Zone.ru › Ruby 3.4

модуль GC

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

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

Вы можете получить информацию об операциях GC через GC::Profiler.

Публичные методы класса

config → хэш
config(хэш) → хэш
Исходный код
# 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.

count → Целое
Исходный код
# File gc.rb, line 100
def self.count
  Primitive.gc_count
end

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

disable → true или false
Исходный код
# File gc.rb, line 66
def self.disable
  Primitive.gc_disable
end

Отключает сборку мусора, возвращая true если сборка мусора была уже отключена.

GC.disable   #=> false
GC.disable   #=> true
enable → true или false
Исходный код
# File gc.rb, line 54
def self.enable
  Primitive.gc_enable
end

Включает сборку мусора, возвращая true если сборка мусора была ранее отключена.

GC.disable   #=> false
GC.enable    #=> true
GC.enable    #=> false
latest_gc_info → хэш
latest_gc_info(хэш) → хэш
latest_gc_info(ключ) → значение
Исходный код
# 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].

measure_total_time → true/false
Исходный код
# 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). Обратите внимание, что измерение может повлиять на производительность приложения.

measure_total_time = true/false
Исходный код
# 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 может немного снизить производительность.

start (full_mark: true, immediate_mark: true, immediate_sweep: true)
Исходный код
# 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, очистка завершается во время вызова этого метода.

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

END_OF_DOCUMENT_MARKER
stat → Hash
stat(hash) → Hash
stat(:key) → Numeric
Исходный код
# 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.

stat_heap → Hash
stat_heap(nil, hash) → Hash
stat_heap(heap_name) → Hash
stat_heap(heap_name, hash) → Hash
stat_heap(heap_name, :key) → Numeric
Исходный код
# 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

Количество раз, когда эта куча запустила завершение инкрементальной маркировки из-за отсутствия пулов слотов.

stress → integer, true, or false
Исходный код
# File gc.rb, line 74
def self.stress
  Primitive.gc_stress_get
end

Возвращает текущий статус режима стрессовых тестов сборки мусора.

stress = flag → flag
Исходный код
# 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
total_time → int
Исходный код
# File gc.rb, line 386
def self.total_time
  Primitive.cexpr! %{
    ULL2NUM(rb_gc_impl_get_total_time(rb_gc_get_objspace()))
  }
end

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

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

garbage_collect (full_mark: true, immediate_mark: true, immediate_sweep: true)
Исходный код
# 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.

Spec-Zone.ru

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