Cela semble être une question simple, mais après beaucoup de lecture sur le sujet, je n'ai toujours pas trouvé de réponse définitive (peut-être parce que c'est si simple).
Ma question est la suivante: lorsqu'un garbage collector compacte des objets dans le tas, comment les références à ces objets dans la pile sont-elles mises à jour? Je peux penser à deux solutions possibles:
- Parcourez la pile (et les références dans le tas) et mettez à jour la référence pour pointer vers le nouvel emplacement de l'objet. Par analogie avec le déménagement, cela reviendrait à envoyer une lettre à toute personne possédant votre adresse et à lui demander de mettre à jour son carnet d'adresses avec votre nouvelle adresse.
- Fournissez une sorte de table de recherche. Ce serait comme laisser une adresse de réexpédition au bureau de poste local.
Les éboueurs utilisent-ils principalement l'une de ces deux méthodes? Une autre méthode? Tous les deux?
garbage-collection
todorojo
la source
la source
Réponses:
Je n'ai aucune expertise spécifique à ce sujet, mais je crois comprendre que la première méthode est généralement utilisée.
Le garbage collector doit quand même analyser la pile pour trouver les éléments du tas auxquels la pile fait référence. Une fois qu'il décide de déplacer quelque chose, il doit de toute façon corriger les références, et il n'y a aucune raison de faire la différence entre le tas et la pile à ce stade.
L'approche de la table de consultation pourrait en principe fonctionner. Cependant, cela obligerait tous les accès au pointeur à prendre 2 étapes. Ce serait un impact énorme sur les performances des temps d'exécution normaux. Particulièrement pour le cas d'utilisation de nombreux petits objets. (C'est un cas où les programmes GC de pointe battent généralement le comptage des références.)
la source