mri ruby GC
Аудитория
Руби освобождает
страницы
gc_sweep_finish(rb_objspace_t *objspace)
heap_pages_free_unused_pages(rb_objspace_t *objspace)
heap_page_free(rb_objspace_t *objspace, struct heap_page *page)
{
free(page);
}
О чем поговорим
• как работает GC
• как устроен GC
• планы ruby team
gc.c
9381 lines and counting
На первый взгляд
Через пару дней
Чем занимается
• создает объекты
• выделяет память под них
• освобождает
• собирает статистику
• проверяет консистентность объектов
• …
• собирает мусор
Структура
mri ruby GC
RVALUE
GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]
# => 40
* sizeof(RVALUE) is
* 20 if 32-bit, double is 4-byte aligned
* 24 if 32-bit, double is 8-byte aligned
* 40 if 64-bit
heap_page
GC::INTERNAL_CONSTANTS[:HEAP_OBJ_LIMIT]
# => 408
HEAP_PAGE_OBJ_LIMIT =
((HEAP_PAGE_SIZE - sizeof(struct heap_page_header)) /
sizeof(struct RVALUE))
RVALUE
typedef struct RVALUE {
union {
struct {
VALUE flags; /* always 0 for freed obj */
struct RVALUE *next;
} free;
struct RBasic basic;
struct RObject object;
struct RClass klass;
struct RString string;
...
struct RComplex complex;
...
} as;
} RVALUE;
RString
struct RString {
struct RBasic basic;
union {
struct {
long len;
char *ptr;
union {
long capa;
VALUE shared;
} aux;
} heap;
char ary[RSTRING_EMBED_LEN_MAX + 1];
} as;
};
Развитие
• early - Mark & Sweep
• 1.9.3 - Lazy Sweep
• 2.0 - CoW friendly
• 2.1 - Mark major / minor
• 2.2 - Inc major Mark, symbols
Mark & Sweep
Mark & Sweep
Mark & Sweep
ObjectSpace.reachable_objects_from_root.keys
[
[0] "vm",
[1] "machine_context",
[2] "global_list",
[3] "end_proc",
[4] "global_tbl"
]
Mark & Sweep
Mark & Sweep
Mark & Sweep
> a = 'a' * 1024 * 1024 * 500
> a = nil; 4.times { GC.start }
Mark & Sweep
Mark
gc_mark_roots(rb_objspace_t *objspace, const char **categoryp) {
rb_thread_t *th = GET_THREAD();
rb_vm_mark(th->vm);
mark_tbl(objspace, finalizer_table);
mark_current_machine_context(objspace, th);
rb_gc_mark_encodings();
/* mark protected global variables */
rb_gc_mark_maybe(*list->varptr);
rb_mark_end_proc();
rb_gc_mark_global_tbl();
}
Sweep
gc_sweep(rb_objspace_t *objspace)
{
if (immediate_sweep) {
gc_sweep_start(objspace);
gc_sweep_rest(objspace);
}
else {
}
gc_heap_prepare_minimum_pages(objspace, heap_eden);
}
mri ruby GC
Sweep
gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
{
while (sweep_page) {
heap->sweep_pages = next = sweep_page->next;
gc_page_sweep(objspace, heap, sweep_page);
heap_unlink_page(objspace, heap, sweep_page);
heap_add_page(objspace, heap_tomb, sweep_page);
sweep_page = next;
}
if (heap->sweep_pages == NULL) {
gc_sweep_finish(objspace);
}
return heap->free_pages != NULL;
}
mri ruby GC
mri ruby GC
Lazy Sweep
Lazy Sweep
gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *heap)
Copy on Write
(CoW)
mri ruby GC
heap_page
struct heap_page {
struct heap_page *prev;
short total_slots;
short free_slots;
short final_slots;
struct heap_page *free_next;
struct heap_page *next;
/* the following three bitmaps are cleared at the beginning of full GC */
bits_t mark_bits[HEAP_PAGE_BITMAP_LIMIT];
};
RGenGC
Major
Minor
Minor
Minor
4.times { GC.start }
if (objspace->last_major_gc > 3 /* magic number */) {
gc_report(1, objspace, "gc_marks_finish: next is full GC!!)n");
objspace->rgengc.need_major_gc |= GPR_FLAG_MAJOR_BY_NOFREE;
}
Major через каждые 3 Minor цикла
RIncGC
только для Major Mark
RIncGC Major Mark
RIncGC Major Mark
objspace->rincgc.step_slots =
(objspace->marked_slots * 2) /
((objspace->rincgc.pooled_slots / HEAP_PAGE_OBJ_LIMIT) + 1);
RIncGC Major Mark
RIncGC Major Mark
heap_prepare(rb_objspace_t *objspace, rb_heap_t *heap)
RGenGC
RIncGC
Restricted
Много слайдов про
remember set
Много слайдов про
write unprotected objects
Немного слайдов про
write protected objects
Можно найти
• http://www.atdot.net/~ko1/activities/
2015_rubyconfph_pub.pdf
• http://www.atdot.net/fp_store/f.p61can/file.data-
incremental-gc.pdf
Дополнительно
• http://tmm1.net/ruby21-rgengc/
• https://ruby-hacking-guide.github.io/gc.html
• Ruby Under a Microscope - Pat Shaughnessy
• http://engineering.heroku.com/blogs/2015-02-04-
incremental-gc
Дальнейшее развитие
GC
mri ruby GC
ссылочка
https://esa-pages.io/p/sharing/2933/posts/
5/2075ee3ce5a11a81cd00.html
mri ruby GC
Оптимизация Sweep
Спасибо
achempion

More Related Content

PPTX
Unity DOTS RTS Case Study
PDF
Autoscaling for fun and profit
PPT
ФИЛП
PDF
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
PDF
02 ns string
PPT
20111204 computer graphics_galinsky_lecture12_real_time
PPTX
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
PDF
Эффективные Алгоритмы Поиска Подобных Объектов Для Терабайтов Данных
Unity DOTS RTS Case Study
Autoscaling for fun and profit
ФИЛП
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
02 ns string
20111204 computer graphics_galinsky_lecture12_real_time
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Эффективные Алгоритмы Поиска Подобных Объектов Для Терабайтов Данных

What's hot (20)

PPT
DV-Discovery
PDF
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
PPT
лекция №16
PDF
Повышение конверсии через оптимизацию JS
PDF
"Применение инфраструктуры YT для поиска нефти и газа". Максим Рябинский, Янд...
PDF
Динамика и статика — метрики графов социальных сетей - Cергей Зефиров
PDF
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
PDF
Марина Степанова "Много объектов на карте"
PDF
Пространственные характеристики
PPTX
Дуров Р. - Cocos2d
PPTX
DSLs in Lisp and Clojure
PDF
Модули на C для Ruby
PPTX
кп по моделир в Cad cam
PDF
msumobi2. Лекция 1
PPT
шлапак 20.10.2017
PDF
Mongo db aggregation
PPTX
Масштабируемость в распределенных in-memory системах
PDF
Наибольший общий делитель
PDF
Лекция 4. MapReduce в Hadoop (введение)
DV-Discovery
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
лекция №16
Повышение конверсии через оптимизацию JS
"Применение инфраструктуры YT для поиска нефти и газа". Максим Рябинский, Янд...
Динамика и статика — метрики графов социальных сетей - Cергей Зефиров
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Марина Степанова "Много объектов на карте"
Пространственные характеристики
Дуров Р. - Cocos2d
DSLs in Lisp and Clojure
Модули на C для Ruby
кп по моделир в Cad cam
msumobi2. Лекция 1
шлапак 20.10.2017
Mongo db aggregation
Масштабируемость в распределенных in-memory системах
Наибольший общий делитель
Лекция 4. MapReduce в Hadoop (введение)
Ad

Viewers also liked (15)

DOC
STI Policy for Iraq
PDF
FlowRateGUI
PPS
Pei colegio metropolitano
PPTX
pp linkedin
PPTX
Diferencia entre escuchar y oir
PPTX
Valor de la escucha
PPTX
Línea de tiempo
PPS
Pei colegio metropolitano
DOC
โครงการ เยี่ยมบ้าน
PDF
หน้าที่พลเมือง
DOC
เอกสารที่เกี่ยวข้อง 1
PDF
รายงานการอบรมปฏิบัติการ วัดผล
PDF
Development of Mobile Applications
PDF
mri ruby gil
STI Policy for Iraq
FlowRateGUI
Pei colegio metropolitano
pp linkedin
Diferencia entre escuchar y oir
Valor de la escucha
Línea de tiempo
Pei colegio metropolitano
โครงการ เยี่ยมบ้าน
หน้าที่พลเมือง
เอกสารที่เกี่ยวข้อง 1
รายงานการอบรมปฏิบัติการ วัดผล
Development of Mobile Applications
mri ruby gil
Ad

Similar to mri ruby GC (20)

PDF
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
PPTX
Статический анализ кода
PPTX
статический анализ кода
PDF
Функционально декларативный дизайн на C++
PDF
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
PDF
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
PPTX
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
PDF
Apache spark
PDF
Лекция 8. Intel Threading Building Blocks
PDF
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
PDF
Лекция 7. Стандарт OpenMP (подолжение)
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
PPTX
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
PDF
Cpp0x Introduction
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
PDF
pgconf.ru 2015 avito postgresql
KEY
Batch processing in rails
PDF
Hacking PostgreSQL. Обзор исходного кода
PDF
C++ exceptions
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Статический анализ кода
статический анализ кода
Функционально декларативный дизайн на C++
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Apache spark
Лекция 8. Intel Threading Building Blocks
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Лекция 7. Стандарт OpenMP (подолжение)
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Cpp0x Introduction
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
pgconf.ru 2015 avito postgresql
Batch processing in rails
Hacking PostgreSQL. Обзор исходного кода
C++ exceptions

mri ruby GC