Одна вещь, о которой я еще не упоминал, это использование дескрипторов памяти. Можно избежать необходимости удваивать память (как это было бы необходимо для алгоритма копирования в стиле Чейни), если каждая ссылка на объект является указателем на структуру, которая содержит реальный адрес рассматриваемого объекта. Использование дескрипторов для объектов памяти сделает некоторые процедуры немного медленнее (необходимо перечитывать адрес памяти объекта каждый раз, когда что-то могло случиться, что могло бы его переместить), но для однопоточных систем, где сборка мусора будет происходить только в предсказуемые моменты времени, это не является большой проблемой и не требует специальной поддержки компилятора (многопоточные системы GC, вероятно, потребуют метаданных, сгенерированных компилятором, независимо от того, используют ли они дескрипторы или прямые указатели).
Если используются дескрипторы и используется один связанный список для живых дескрипторов (одно и то же хранилище можно использовать для хранения связанного списка для мертвых дескрипторов, нуждающихся в перераспределении), можно, отметив основную запись для каждого дескриптора, пройти список дескрипторов в порядке размещения и скопировать блок, указанный этим дескриптором, в начало кучи. Поскольку дескрипторы будут скопированы по порядку, не будет необходимости использовать вторую область кучи. Кроме того, поколения могут поддерживаться путем отслеживания некоторых указателей вершины кучи. При уплотнении памяти начните с компактификации элементов, добавленных с момента последнего ГХ. Если это не освобождает достаточно места, компактифицируйте предметы, добавленные с последнего уровня 1 GC. Если это не освобождает достаточно места, компактифицируйте все. Фаза маркировки, вероятно, должна была бы воздействовать на объекты всех поколений, но дорогостоящая стадия уплотнения не будет.
На самом деле, используя подход, основанный на дескрипторе, если кто-то маркирует вещи всех поколений, можно при желании вычислить на каждом ГХ пропускную способность, сколько места может быть освобождено в каждом поколении. Если половина объектов в Gen2 мертва, возможно, стоит сделать коллекцию Gen2, чтобы уменьшить частоту коллекций Gen1.