модуль GC
Модуль GC предоставляет интерфейс к механизму сбора мусора Ruby по принципу «маркировка и очистка».
Некоторые из базовых методов также доступны через модуль ObjectSpace.
Вы можете получить информацию об операциях GC с помощью GC::Profiler.
Константы
- INTERNAL_CONSTANTS
-
Внутренние константы в сборщике мусора.
- OPTS
-
Параметры сборки GC
Методы публичного класса
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 при выделении экземпляра заданных классов.
static VALUE
gc_get_auto_compact(VALUE _)
{
return RBOOL(ruby_enable_autocompact);
} Возвращает значение, указывающее, включена ли автоматическая уплотнение.
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;
} Обновляет режим автоматической уплотнения.
При включенном режиме уплотнитель будет выполняться при каждом основном цикле сбора мусора.
Включение уплотнения ухудшит производительность при основных циклах сбора мусора.
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)
# File gc.rb, line 105 def self.count Primitive.gc_count end
Количество раз, когда произошел GC.
Возвращает количество раз, когда произошел GC с момента запуска процесса.
# File gc.rb, line 69 def self.disable Primitive.gc_disable end
Отключает сборку мусора, возвращая true если сборка мусора была уже отключена.
GC.disable #=> false GC.disable #=> true
# File gc.rb, line 57 def self.enable Primitive.gc_enable end
Включает сборку мусора, возвращая true если сборка мусора была ранее отключена.
GC.disable #=> false GC.enable #=> true GC.enable #=> false
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 перечисляет количество объектов, которые фактически были перемещены. Некоторые объекты не могут быть перемещены (возможно, они были прикреплены), поэтому эти числа могут быть использованы для расчета эффективности уплотнения.
# File gc.rb, line 266 def self.latest_gc_info hash_or_key = nil Primitive.gc_latest_gc_info hash_or_key end
Возвращает информацию о последнем цикле сборки мусора.
Если необязательный аргумент, хеш, задан, он перезаписывается и возвращается. Это сделано для того, чтобы избежать эффекта зондирования.
static VALUE
gc_malloc_allocated_size(VALUE self)
{
return UINT2NUM(rb_objspace.malloc_params.allocated_size);
} Возвращает размер памяти, выделенной функцией malloc().
Доступно только если ruby был скомпилирован с CALC_EXACT_MALLOC_SIZE.
static VALUE
gc_malloc_allocations(VALUE self)
{
return UINT2NUM(rb_objspace.malloc_params.allocations);
} Возвращает количество выделений памяти функцией malloc().
Доступно только если ruby был скомпилирован с CALC_EXACT_MALLOC_SIZE.
# File gc.rb, line 308
def self.measure_total_time
Primitive.cexpr! %{
RBOOL(rb_objspace.flags.measure_gc)
}
end Возвращает флаг measure_total_time (по умолчанию: true). Обратите внимание, что измерение может повлиять на производительность приложения.
# 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 может привести к некоторым накладным расходам на производительность.
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 при выделении экземпляра заданных классов.
# 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, очистка завершается во время вызова этого метода.
Примечание: Эти ключевые аргументы зависят от реализации и версии. Они не гарантируют совместимость с будущими версиями и могут быть проигнорированы, если основная реализация их не поддерживает.
# 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.
# 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
-
Количество раз, когда эта куча принудительно завершила инкрементальную маркировку из-за отсутствия пулов слотов.
# File gc.rb, line 77 def self.stress Primitive.gc_stress_get end
Возвращает текущий статус режима стресса GC.
# 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
# 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 Возвращает измеренное полное время сборки мусора в наносекундах.
# 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.
static VALUE
gc_verify_internal_consistency_m(VALUE dummy)
{
gc_verify_internal_consistency(&rb_objspace);
return Qnil;
} Проверка внутренней согласованности.
Этот метод специфичен для реализации. Теперь этот метод проверяет генерационную согласованность, если поддерживается RGenGC.
Общедоступные методы экземпляров
# 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.