Все виды сборки мусора: как Java, Go, Python, JavaScript и Rust освобождают память
Mizu
0:00 / 0:00
Все виды сборки мусора: как Java, Go, Python, JavaScript и Rust освобождают память
2 360 просмотров · 3 дн. назад
Mizu
578 подписчиков
2 360 просмотров · 3 дн. назад
Сборка мусора: объяснение того, как Java, Go, Python, JavaScript и Rust обеспечивают свободную память
Сборщик мусора возвращает вам память, но он может ответить только на один вопрос: может ли программа по-прежнему получить доступ к этому объекту. В этом видео создается небольшая куча и используется для объяснения подсчета ссылок, алгоритма «пометки и очистки», компактизации, копирования, поколений, барьеров записи и загрузки, а также того, почему в каждом проекте идет компромисс между процессорным временем, паузами и свободной памятью. Затем рассматривается, что на самом деле делают Java, Go, .NET, JavaScript, Python, Ruby, Swift, Rust, Erlang и C++, и порядок настройки, когда память или паузы создают проблемы.
Разделы
0:00 Память, куча и мусор
1:18 Корни и достижимость
1:54 Подсчет ссылок
2:39 Трассировка: пометка, сканирование, компактирование, копирование
3:34 Поколения и барьеры записи
4:23 Паузы, параллелизм и барьеры
5:29 Java: G1, ZGC и Parallel
6:34 Go: GOGC и GOMEMLIMIT
7:26 .NET и JavaScript (V8)
8:29 Python и Ruby
9:03 Swift, Rust, Erlang и C++
10:01 Выбор и настройка
Источники
Jones, Hosking, Moss: The Garbage Collection Handbook, 2nd ed.: https://gchandbook.org/
Go: A Guide to the Go Garbage Collector (roots, live heap, escape analysis, GOGC, GOMEMLIMIT, mark assists): https://go.dev/doc/gc-guide
Документация Python: модуль gc (подсчет ссылок + сборщик циклов): https://docs.python.org/3/library/gc....
Deutsch и Bobrow: Эффективный, инкрементальный, автоматический сборщик мусора, CACM 1976: https://doi.org/10.1145/360336.360345
Cheney: Нерекурсивный алгоритм сжатия списков, CACM 1970 (копирование сборки): https://doi.org/10.1145/362790.362798
Блог V8: Trash talk, сборщик мусора Orinoco: https://v8.dev/blog/trash-talk
Ungar: Генерационная сборка мусора, SDE 1984: https://doi.org/10.1145/800020.808261
Oracle: сборщик мусора «сначала мусор» (G1) (регионы, запомненные наборы, таблица карт, цель паузы): https://docs.oracle.com/en/java/javas...
Дийкстра, Лампорт, Мартин, Шолтен, Стеффенс: Сборка мусора «на лету», CACM 1978 (трехцветная маркировка): https://doi.org/10.1145/359642.359655
Предложение Go: исключить повторное сканирование стека (гибридный барьер записи): https://github.com/golang/proposal/bl...
Бейкер: Обработка списков в реальном времени на последовательном компьютере, CACM 1978 (прочитать о барьерах): https://doi.org/10.1145/359460.359470
Oracle: Руководство по настройке сборки мусора для виртуальных машин HotSpot (JDK 25): https://docs.oracle.com/en/java/javas...
JEP 439: Поколенческая сборка мусора: https://openjdk.org/jeps/439
JEP 490: Сборка мусора, удаление негенерационного режима: https://openjdk.org/jeps/490
Вики OpenJDK по сборке мусора: https://wiki.openjdk.org/display/zgc/...
Примечания к выпуску Go 1.26 (изменения в сборщике мусора): https://go.dev/doc/go1.26
Microsoft: Основы сборки мусора (поколения .NET, куча больших объектов): https://learn.microsoft.com/dotnet/st...
Microsoft: Динамическая адаптация к размерам приложений (DATAS): https://learn.microsoft.com/dotnet/st...
Блог V8: Параллельная маркировка в V8: https://v8.dev/blog/concurrent-marking
Блог V8: Orinoco, сборка мусора молодого поколения: https://v8.dev/blog/orinoco-parallel-...
Что нового в Python 3.14 (инкрементальный циклический сборщик мусора; отменено в 3.14.5): https://docs.python.org/3.14/whatsnew...
Руководство разработчика CPython: проектирование сборщика мусора: https://devguide.python.org/internals...
Документация Ruby: сборка мусора (поколенческая, инкрементальная) маркировка, компактизация): https://docs.ruby-lang.org/en/master/...
Исходный код Ruby: gc/README: https://github.com/ruby/ruby/blob/mas...
Язык программирования Swift: автоматический подсчет ссылок: https://docs.swift.org/swift-book/doc...
Язык программирования Rust: циклы ссылок могут приводить к утечке памяти: https://doc.rust-lang.org/book/ch15-0...
Rust std::rc (Rc и Weak): https://doc.rust-lang.org/std/rc/
Erlang/OTP: сборщик мусора Erlang (кучи для каждого процесса): https://www.erlang.org/doc/apps/erts/...
cppreference: динамическое управление памятью (умные указатели): https://en.cppreference.com/w/cpp/memory
Oracle: Введение в настройку сборки мусора (пропускная способность, задержка, занимаемое место): https://docs.oracle.com/en/java/javas...
Bacon, Cheng, Rajan: Единая теория сборки мусора, OOPSLA 2004: https://doi.org/10.1145/1028976.1028982