Чтобы классифицировать вещи, давайте определим макет памяти, а затем поговорим о том, как работает GC.
Макет памяти
В Erlang каждый поток исполнения называется процессом. Каждый процесс имеет свою собственную память, а макет памяти состоит из трех частей: блок управления процессом, стек и куча.
- PCB: процесс Контрольный блок содержит информацию, такую как идентификатор процесса (PID), текущее состояние (работа, ожидание), его зарегистрированное имя и т. Д.
- Stack: это растущая область памяти, которая поддерживает входящие и исходящие параметры , возвращать адреса, локальные переменные и временные пробелы для оценки выражений.
- Куча: это растущая область памяти, которая содержит сообщения почтового ящика процесса и составные термины. Двоичные термины, размер которых превышает 64 байта, НЕ хранятся в частной куче процесса. Они хранятся в большой Shared Heap, доступной для всех процессов.
Сбор мусора
В настоящее время Erlang использует коллекцию мусора Generational, которая работает внутри каждого Erlang обрабатывать частную кучу независимо, а также собирать сборку ссылок Counting для глобальной общей кучи.
- Private Heap GC: Это поколение, поэтому делит кучу на два сегмента: молодое и старое поколение. Также есть две стратегии для сбора; Генерация (Малая) и Fullsweep (Major). Генерация GC просто собирает молодую кучу, но fullsweep собирает как молодую, так и старую кучу.
- Общая куча GC: Это подсчет ссылок. Каждый объект в общей куче (Refc) имеет счетчик ссылок на него, хранящийся другими объектами (ProcBin), которые хранятся внутри частной кучи процессов Erlang. Если контрольный счетчик объекта достигает нуля, объект становится недоступным и будет уничтожен.
Чтобы получить более подробную информацию и рекомендации по производительности, просто взгляните на мою статью, которая является источником ответ: Подробности коллекции мусора Эрланг и почему это имеет значение
задан Andrew 27 February 2019 в 15:26
поделиться