Spec-Zone.ru › Ruby 3.3

модуль GC

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

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

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

Константы

INTERNAL_CONSTANTS

Внутренние константы в сборщике мусора.

OPTS

Параметры сборки GC

Методы публичного класса

add_stress_to_class(class[, ...]) Показать исходный код
static VALUE
rb_gcdebug_add_stress_to_class(int argc, VALUE *argv, VALUE self)
{
    rb_objspace_t *objspace = &rb_objspace;

    if (!stress_to_class) {
        set_stress_to_class(rb_ary_hidden_new(argc));
    }
    rb_ary_cat(stress_to_class, argv, argc);
    return self;
}

Вызывает NoMemoryError при выделении экземпляра заданных классов.

auto_compact → true или false Показать исходный код
static VALUE
gc_get_auto_compact(VALUE _)
{
    return RBOOL(ruby_enable_autocompact);
}

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

auto_compact = флаг Показать исходный код
static VALUE
gc_set_auto_compact(VALUE _, VALUE v)
{
    GC_ASSERT(GC_COMPACTION_SUPPORTED);

    ruby_enable_autocompact = RTEST(v);

#if RGENGC_CHECK_MODE
    ruby_autocompact_compare_func = NULL;

    if (SYMBOL_P(v)) {
        ID id = RB_SYM2ID(v);
        if (id == rb_intern("empty")) {
            ruby_autocompact_compare_func = compare_free_slots;
        }
    }
#endif

    return v;
}

Обновляет режим автоматической уплотнения.

При включенном режиме уплотнитель будет выполняться при каждом основном цикле сбора мусора.

Включение уплотнения ухудшит производительность при основных циклах сбора мусора.

compact Показать исходный код
static VALUE
gc_compact(VALUE self)
{
    /* Run GC with compaction enabled */
    gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);

    return gc_compact_stats(self);
}

Эта функция уплотняет объекты в куче Ruby. Она устраняет неиспользуемое пространство (или фрагментацию) в куче, перемещая объекты в это неиспользуемое пространство. Эта функция возвращает хеш, содержащий статистику о перемещенных объектах. См. GC.latest_gc_info для получения подробной информации о статистике уплотнения.

Этот метод специфичен для реализации и не ожидается, что он будет реализован в любой реализации помимо MRI.

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

GC.respond_to?(:compact)
count → Целое число Показать исходный код
# File gc.rb, line 105
def self.count
  Primitive.gc_count
end

Количество раз, когда произошел GC.

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

disable → true или false Показать исходный код
# File gc.rb, line 69
def self.disable
  Primitive.gc_disable
end

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

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

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

GC.disable   #=> false
GC.enable    #=> true
GC.enable    #=> false
latest_compact_info → хеш Показать исходный код
static VALUE
gc_compact_stats(VALUE self)
{
    size_t i;
    rb_objspace_t *objspace = &rb_objspace;
    VALUE h = rb_hash_new();
    VALUE considered = rb_hash_new();
    VALUE moved = rb_hash_new();
    VALUE moved_up = rb_hash_new();
    VALUE moved_down = rb_hash_new();

    for (i=0; i<T_MASK; i++) {
        if (objspace->rcompactor.considered_count_table[i]) {
            rb_hash_aset(considered, type_sym(i), SIZET2NUM(objspace->rcompactor.considered_count_table[i]));
        }

        if (objspace->rcompactor.moved_count_table[i]) {
            rb_hash_aset(moved, type_sym(i), SIZET2NUM(objspace->rcompactor.moved_count_table[i]));
        }

        if (objspace->rcompactor.moved_up_count_table[i]) {
            rb_hash_aset(moved_up, type_sym(i), SIZET2NUM(objspace->rcompactor.moved_up_count_table[i]));
        }

        if (objspace->rcompactor.moved_down_count_table[i]) {
            rb_hash_aset(moved_down, type_sym(i), SIZET2NUM(objspace->rcompactor.moved_down_count_table[i]));
        }
    }

    rb_hash_aset(h, ID2SYM(rb_intern("considered")), considered);
    rb_hash_aset(h, ID2SYM(rb_intern("moved")), moved);
    rb_hash_aset(h, ID2SYM(rb_intern("moved_up")), moved_up);
    rb_hash_aset(h, ID2SYM(rb_intern("moved_down")), moved_down);

    return h;
}

Возвращает информацию о перемещенном объекте в последнем уплотнении GC.

Возвращаемый хеш имеет два ключа: :considered и :moved. Хеш для :considered перечисляет количество объектов, которые были рассмотрены для перемещения уплотнителем, а хеш :moved перечисляет количество объектов, которые фактически были перемещены. Некоторые объекты не могут быть перемещены (возможно, они были прикреплены), поэтому эти числа могут быть использованы для расчета эффективности уплотнения.

latest_gc_info → хеш Показать исходный код
latest_gc_info(хеш) → хеш
latest_gc_info(:major_by) → :malloc
# File gc.rb, line 266
def self.latest_gc_info hash_or_key = nil
  Primitive.gc_latest_gc_info hash_or_key
end

Возвращает информацию о последнем цикле сборки мусора.

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

malloc_allocated_size → Целое число Показать исходный код
static VALUE
gc_malloc_allocated_size(VALUE self)
{
    return UINT2NUM(rb_objspace.malloc_params.allocated_size);
}

Возвращает размер памяти, выделенной функцией malloc().

Доступно только если ruby был скомпилирован с CALC_EXACT_MALLOC_SIZE.

malloc_allocations → Целое число Показать исходный код
static VALUE
gc_malloc_allocations(VALUE self)
{
    return UINT2NUM(rb_objspace.malloc_params.allocations);
}

Возвращает количество выделений памяти функцией malloc().

Доступно только если ruby был скомпилирован с CALC_EXACT_MALLOC_SIZE.

measure_total_time → true/false Показать исходный код
# File gc.rb, line 308
def self.measure_total_time
  Primitive.cexpr! %{
    RBOOL(rb_objspace.flags.measure_gc)
  }
end

Возвращает флаг measure_total_time (по умолчанию: true). Обратите внимание, что измерение может повлиять на производительность приложения.

measure_total_time = true/false Показать исходный код
# File gc.rb, line 296
def self.measure_total_time=(flag)
  Primitive.cstmt! %{
    rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;
    return flag;
  }
end

Включает измерение времени GC. Результат можно получить с помощью GC.stat(:time). Обратите внимание, что измерение времени GC может привести к некоторым накладным расходам на производительность.

remove_stress_to_class(class[, ...]) Показать исходный код
static VALUE
rb_gcdebug_remove_stress_to_class(int argc, VALUE *argv, VALUE self)
{
    rb_objspace_t *objspace = &rb_objspace;
    int i;

    if (stress_to_class) {
        for (i = 0; i < argc; ++i) {
            rb_ary_delete_same(stress_to_class, argv[i]);
        }
        if (RARRAY_LEN(stress_to_class) == 0) {
            set_stress_to_class(0);
        }
    }
    return Qnil;
}

Больше не вызывает NoMemoryError при выделении экземпляра заданных классов.

start(full_mark: true, immediate_mark: true, immediate_sweep: true) Показать исходный код
# File gc.rb, line 38
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.

Ключевой аргумент immedate_sweep определяет, будет ли откладываться очистка (с помощью ленивой очистки). При значении true, очистка выполняется поэтапно, переплетаясь с будущим выполнением кода Ruby, поэтому очистка может не завершиться во время вызова этого метода. При значении false, очистка завершается во время вызова этого метода.

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

END_OF_DOCUMENT_MARKER
stat → Хэш Показать исходный код
stat(хэш) → Хэш
stat(:ключ) → Числовое
# File gc.rb, line 189
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

Когда :old_malloc_increase_bytes превышает этот предел, запускается майора сборка мусора.

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

Этот метод ожидается работоспособным только в CRuby.

stat_heap → Хэш Показать исходный код
stat_heap(null, хэш) → Хэш
stat_heap(имя_кучи) → Хэш
stat_heap(имя_кучи, хэш) → Хэш
stat_heap(имя_кучи, :ключ) → Числовое
# File gc.rb, line 252
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 → целое число, true или false Показать исходный код
# File gc.rb, line 77
def self.stress
  Primitive.gc_stress_get
end

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

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

Обновляет режим стресса GC.

При включённом режиме стресса GC вызывается при каждой возможности: все выделения памяти и объектов.

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

Флаг может быть true, false или целым числом, битовым ИЛИ следующих флагов.

0x01:: no major GC
0x02:: no immediate sweep
0x04:: full mark after malloc/calloc/realloc
total_time → int Показать исходный код
# File gc.rb, line 318
def self.total_time
  Primitive.cexpr! %{
    ULL2NUM(rb_objspace.profile.marking_time_ns + rb_objspace.profile.sweeping_time_ns)
  }
end

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

verify_compaction_references(направление: null, двойная_куча: false) → хэш Показать исходный код
# File gc.rb, line 285
def self.verify_compaction_references(toward: nil, double_heap: false, expand_heap: false)
  Primitive.gc_verify_compaction_references(double_heap, expand_heap, toward == :empty)
end

Проверяет согласованность ссылок уплотнения.

Этот метод специфичен для реализации. Во время уплотнения объекты, которые были перемещены, заменяются объектами T_MOVED. Ни один объект не должен иметь ссылку на объект T_MOVED после уплотнения.

Эта функция расширяет кучу, чтобы обеспечить место для перемещения всех объектов, уплотняет кучу, чтобы убедиться, что всё перемещено, обновляет все ссылки, затем выполняет полную сборку мусора. Если любой объект содержит ссылку на объект T_MOVED, этот объект должен быть помещён в стек маркировки, и это приведёт к SEGV.

verify_internal_consistency → null Показать исходный код
static VALUE
gc_verify_internal_consistency_m(VALUE dummy)
{
    gc_verify_internal_consistency(&rb_objspace);
    return Qnil;
}

Проверка внутренней согласованности.

Этот метод специфичен для реализации. Теперь этот метод проверяет генерационную согласованность, если поддерживается RGenGC.

Общедоступные методы экземпляров

garbage_collect(полная_маркировка: true, немедленная_маркировка: true, немедленное_очищение: true) Показать исходный код
# File gc.rb, line 43
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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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