Si vous pensez que les objets dans la mémoire comme un arbre, les "racines" est la racine de nœuds - chaque objet immédiatement accessible par votre programme.
Person p = new Person();
p.car = new Car(RED);
p.car.engine = new Engine();
p.car.horn = new AnnoyingHorn();
Il y a quatre objets; une personne, une voiture rouge, son moteur et klaxon. Tracer le graphique de référence:
Person [p]
|
Car (red)
/ \
Engine AnnoyingHorn
Et vous vous retrouverez avec Person
à la "racine" de l'arbre. Il est vivant parce qu'il est référencé par une variable locale, p
, laquelle le programme peut utiliser à tout moment pour se référer à l' Person
objet. Il en va de même pour les autres objets, par le biais p.car
, p.car.engine
, etc.
Depuis Person
et tous les autres objets de manière récursive qui y sont connectés sont en direct, il y aurait des problèmes si le GC a recueillis.
Toutefois, si le suivant est exécuté après un moment:
p.car = new Car(BLUE);
Et de redessiner le graphique:
Person [p]
|
Car (blue) Car (red)
/ \
Engine AnnoyingHorn
Maintenant l' Person
est accessible par le biais p
et la voiture bleue par p.car
, mais il n'existe aucun moyen de la voiture rouge ou de ses parties, ne peut jamais être de nouveau accessible - ils ne sont pas connectés à un live de la racine. Ils peuvent être en toute sécurité collectées.
Donc, c'est vraiment une question de prendre chaque point de départ (toutes les variables locales, variables globales, statique, tout dans d'autres threads et la pile d'images) - chaque racine et, récursivement, à la suite de toutes les références pour établir une liste de tous les objets "en direct": les objets qui sont en cours d'utilisation et ne convient pas pour la suppression. Tout le reste est des ordures, en attente d'être collectés.