Перейти к содержимому

Все виды сборки мусора: как 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