Une chose que je n'ai pas encore vue mentionnée est l'utilisation de poignées de mémoire. On peut éviter d'avoir à doubler la mémoire (comme cela serait nécessaire avec l'algorithme de copie de style Cheney) si chaque référence d'objet est un pointeur vers une structure qui contient l'adresse réelle de l'objet en question. L'utilisation de handles pour les objets mémoire rendra certaines routines un peu plus lentes (il faut relire l'adresse mémoire d'un objet à chaque fois qu'il se passe quelque chose qui le déplace) mais pour les systèmes monofilaires où la collecte des déchets ne se fait qu'à des moments prévisibles, ce n'est pas un trop gros problème et cela ne nécessite pas de support spécial du compilateur (les systèmes GC multithreads auront probablement besoin de métadonnées générées par le compilateur, qu'ils utilisent des handles ou des pointeurs directs).
Si l'on utilise des handles, et que l'on utilise une liste liée pour les handles vivants (le même stockage peut être utilisé pour contenir une liste liée pour les handles morts nécessitant une réallocation), on peut, après avoir marqué la fiche de chaque handle, parcourir la liste des handles, dans l'ordre d'allocation, et copier le bloc référencé par ce handle au début du tas. Comme les handles seront copiés dans l'ordre, il ne sera pas nécessaire d'utiliser une deuxième zone de tas. De plus, les générations peuvent être supportées en gardant la trace de quelques pointeurs au sommet du tas. Lorsque vous compactez la mémoire, commencez par compacter les éléments ajoutés depuis la dernière GC. Si cela ne libère pas assez d'espace, compactez les éléments ajoutés depuis la dernière GC de niveau 1. Si cela ne libère pas assez d'espace, compactez tout. La phase de marquage devrait probablement agir sur les objets de toutes les générations, mais pas l'étape coûteuse de compactage.
En fait, en utilisant une approche basée sur les poignées, si l'on marque les objets de toutes les générations, on pourrait, si on le souhaite, calculer à chaque passage GC la quantité d'espace qui pourrait être libérée dans chaque génération. Si la moitié des objets de la génération 2 sont morts, il peut être intéressant de faire une collecte de la génération 2 afin de réduire la fréquence des collectes de la génération 1.