Я пытаюсь реализовать простой язык программирования. Я хочу, чтобы пользователю этого не нужно было управлять памятью, поэтому я решил реализовать сборщик мусора. Самый простой способ, который я могу придумать после проверки некоторых материалов, выглядит следующим образом:Некоторые моменты о реализации сборщика мусора
Существует два типа зон кучи. Первый - для хранения больших объектов (более 85 000 байт), другой для небольших объектов. В следующем я использую BZ для первого, SZ для второго.
BZ использует алгоритм отметки и развертки, потому что перемещение большого объекта дорого. Я не компактен, поэтому будет фрагментация.
SZ использует поколения с меткой-компактностью. Существует три поколения: 0, 1 и 2. Запросы на распределение направляются непосредственно в поколение 0, а когда поколение 0 заполнено, я сделаю сборку мусора на нем, выживаемость будет повышена до поколения 1. поколение 1, а поколение 2 будет тоже сделать сборщик мусора когда полностью.
Когда виртуальная машина запускается, она будет выделять большую память из ОС, которая будет использоваться в качестве зоны кучи в виртуальной машине. BZ и каждое поколение в SZ будут занимать фиксированную часть памяти и когда запрос на распределение не может быть удовлетворено, виртуальная машина выдаст ошибку OTM (вне памяти). У этого есть проблема: при запуске виртуальной машины даже для запуска программы на нее должна быть только небольшая память, но она все еще использует много. Лучший способ для виртуальной машины получить небольшой объем памяти из ОС, а затем, когда программе потребуется больше памяти, виртуальная машина получит больше от ОС. Я собираюсь выделить большую память для поколения 2 в SZ, а затем скопировать все вещи в поколении 2 в новую зону памяти. И сделайте то же самое для BZ.
Другая проблема возникает, когда BZ заполнен и SZ пуст, я бы глупо не смог удовлетворить большой запрос на размещение объектов, хотя у нас на самом деле имеется достаточно свободного размера кучи для большого объекта в SZ. Как справиться с этой проблемой?
интересно, можете ли вы динамически изменять размер BZ и SZ на основе эвристики (время, когда вы запрашиваете больше памяти из ОС) ... – Imposter
@Imposter Не могли бы вы сказать больше, я не могу уловить вашу точку – haipeng31
Ну, вы проверили какие другие системы управления памятью делают? – delnan