модуль 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) {
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);
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, используйте выражение:
GC.respond_to?(:compact)
# File gc.rb, line 99 def self.count Primitive.gc_count end
Количество раз, когда произошла сборка мусора.
Возвращает количество раз, когда произошла сборка мусора с момента запуска процесса.
# File gc.rb, line 63 def self.disable Primitive.gc_disable end
Отключает сборку мусора, возвращая true , если сборка мусора уже была отключена.
GC.disable #=> false GC.disable #=> true
# File gc.rb, line 51 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 231 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 273
def self.measure_total_time
Primitive.cexpr! %{
RBOOL(rb_objspace.flags.measure_gc)
}
end Возвращает флаг measure_total_time (по умолчанию: true). Обратите внимание, что измерение может повлиять на производительность приложения.
# File gc.rb, line 261
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) {
stress_to_class = 0;
}
}
return Qnil;
} Больше не вызывает NoMemoryError при выделении экземпляров заданных классов.
# File gc.rb, line 33 def self.start full_mark: true, immediate_mark: true, immediate_sweep: true Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false end
Инициализирует сборку мусора, даже если она отключена вручную.
Этот метод определён с ключевыми аргументами, которые по умолчанию равны true:
def GC.start(full_mark: true, immediate_sweep: true); end
Используйте full_mark: false для выполнения minor GC. Используйте immediate_sweep: false для отсрочки очистки (используйте lazy sweep).
Примечание: Эти ключевые аргументы зависят от реализации и версии. Они не гарантируют совместимости с будущими версиями и могут быть проигнорированы, если основная реализация не поддерживает их.
# File gc.rb, line 183 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 217 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.
# File gc.rb, line 71 def self.stress Primitive.gc_stress_get end
Возвращает текущий статус режима стрессовых нагрузок для сборщика мусора.
# File gc.rb, line 89 def self.stress=(flag) Primitive.gc_stress_set_m flag end
Обновляет режим стрессовых нагрузок для сборщика мусора.
Когда режим стрессовых нагрузок включен, сборщик мусора вызывается при каждой возможности: все выделения памяти и объектов.
Включение режима стрессовых нагрузок снизит производительность, он предназначен только для отладки.
Флаг может быть true, false или целым числом, битовым ИЛИ, следующими флагами.
0x01:: no major GC 0x02:: no immediate sweep 0x04:: full mark after malloc/calloc/realloc
# File gc.rb, line 283
def self.total_time
Primitive.cexpr! %{
ULL2NUM(rb_objspace.profile.total_time_ns)
}
end Возвращает измеренное общее время работы сборщика мусора в наносекундах.
static VALUE
gc_using_rvargc_p(VALUE mod)
{
#if USE_RVARGC
return Qtrue;
#else
return Qfalse;
#endif
} Возвращает true, если используется экспериментальная функция «Выделение переменной ширины», в противном случае false.
# File gc.rb, line 250 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.
static VALUE
gc_verify_transient_heap_internal_consistency(VALUE dmy)
{
rb_transient_heap_verify();
return Qnil;
} Публичные методы экземпляров
# File gc.rb, line 37 def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false end
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.