62 votes

Quelles sont les causes?

Quelles sont les racines de la collecte des ordures?

J'ai lu la définition de la racine que "toute référence que vous programme peut accéder à" et la définition de live, c'est qu'un objet qui est utilisé, qui peut être une variable locale, variable statique.

Je m peu confus avec discriminatoire de la différence entre la racine et les objets vivants.

Qu'est-ce que le chemin à la racine? Comment racine et de vivre les objets de travail?

Quelqu'un peut-il développer ?

86voto

aib Points 18608

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.

29voto

Vineet Reynolds Points 40529

Les racines ou la collecte des ordures racines sont les objets qui sont toujours accessibles. Si un objet est toujours accessible, alors il n'est pas admissible pour la collecte des ordures, les racines sont donc toujours inéligible pour la collection. C'est la première série d'objets à partir d'où l'accessibilité de tous les autres objets sur le tas sont déterminés.

D'autres objets sur le tas accessible à partir de la collecte des ordures racines sont considérées comme des objets vivants, et non admissibles pour la collecte; les objets qui sont inaccessibles peuvent être marqués pour la remise en état.

Je sais que Java plus de la .Net plate-forme, je vais donc parler que pour une seule. Sur la plate-forme Java, le GC racines sont en fait dépendant de l'implémentation. Dans la plupart des runtime cependant, le GC racines ont tendance à être les opérandes sur la pile (car ils sont actuellement en cours d'utilisation par les threads) et de classe (statique) des membres de classes. L'accessibilité est calculé à partir de ces objets dans la plupart des machines virtuelles. Il y a d'autres cas où les paramètres et les opérandes utilisés par JNI les appels seront considérés comme faisant partie de la racine du jeu, et également utilisé pour calculer l'accessibilité.

J'espère que cela efface les doutes persistants sur ce qu'est une racine (set) et qu'est ce qu'un objet en direct.

3voto

irreputable Points 25577

En java, je dirais que les threads sont la racine des objets. Chaque objet live peut être retracée à une discussion en direct. Par exemple, un objet statique est référencé par une classe, qui est référencé par un chargeur de classe, qui est référencée par une autre classe, qui est référencé par une instance de cette classe, ... qui est référencé par un Exécutable, qui est référencé par un fil en direct. (Remarque, les classes peuvent être GC ed, ils ne peuvent pas être des racines)

On peut aussi considérer un "réel" de la racine de tous les threads, mais qui est hors de la sphère de Java standard. Nous ne pouvons pas dire ce que c'est, et comment il les références de tous les threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X