2010-03-12 7 views
11

Je me demandais comment le garbage collector dans Java traite la situation suivante.Comment fonctionne Garbage Collection en Java?

Objet A a une référence à l'objet B et l'objet B a une référence à l'objet C. Le programme principal est une référence à l'objet A. Vous pouvez donc utiliser l'objet creux B Objet A, et le creux de l'objet C Objet B Au travers de l'objet A.

Qu'arrive-t-il à l'objet B et à l'objet C si le lien entre l'objet A et l'objet B est défini sur null?

L'objet B et l'objet C doivent-ils maintenant être collectés par le récupérateur de place? Je veux dire qu'il existe toujours une connexion entre l'objet B et l'objet C.

+0

J'ai posé l'autre question dans un post différent: http://stackoverflow.com/questions/2433261/how-does-garbage-collection-in-java-work-with-classes – JordyOnrust

Répondre

9

L'objet B et l'objet C doivent-ils être maintenant collectés par le récupérateur de place?

Oui. Eh bien, ils sont des candidats pour la collecte, car il n'y a pas moyen d'atteindre l'objet B et C à la racine qui est A.

4

Vous ne pouvez pas compter sur le garbage collector pour fonctionner à un moment donné, car son comportement est imprévisible, tout ce que vous pouvez dire, c'est que les objets B et C sont seulement éligibles pour la collecte des ordures

1

Je pense que la logique est différente. Si l'objet n'est pas accessible depuis un thread, il peut être collecté.

6

Oui, B et C sont éligibles pour la collecte des ordures, si elles ne peuvent pas être atteintes à partir de n'importe quelle racine GC (les racines GC sont généralement tous les Threads et toutes les références sur la pile).

+0

...et toutes les variables statiques –

+3

@Maurice: pas directement, autant que je sache. Les variables statiques peuvent être atteintes via la 'Classe' à laquelle elles appartiennent, qui peut être atteinte via le' ClassLoader' qui les a chargées, ce qui peut être atteint via d'autres classes qui peuvent être atteintes via des objets de ce type. Donc, si le 'ClassLoader' est GCed, vous pouvez même perdre la valeur d'une variable statique. –

+0

Vous avez peut-être raison –

1

S'il n'y a pas de référence à l'objet, il sera adapté pour GC de procéder

2

En fait, la collecte des ordures dans Java est une chose très sophistiquée, beaucoup plus que dans l'interpréteur Ruby, à titre d'exemple.

De toute façon, la base théorique est la même. Le CPG identifie les graphes d'objets qui ne sont plus accessibles par code de programme (c'est-à-dire qu'ils n'ont plus de référence dans le code actif). Quand je parle de graphe d'objets, je parle précisément du graphe d'objets B-> C. une fois qu'il est inaccessible, il peut être GC'ed, mais vous ne pouvez pas dire quand il sera, en raison du GC essayant d'optimiser autant que possible son travail pour éviter de ralentir l'application vers le bas.

2

B et C sont éligibles pour la récupération de place car vous ne pouvez plus y accéder. Compte tenu de l'imprévisibilité du ramasseur d'ordures, tout ce que nous savons, c'est qu'il y a de fortes chances qu'ils soient collectés à un moment donné.

0

B n'a pas de référence à ce donc il sera nettoyé d'abord, il comprendra que C n'a pas de référence à, donc C sera nettoyé. C'est pour l'illustration, Jvm est assez intelligent pour les ramasser dans un balayage.

+2

Il n'y a aucun moyen de dire que B sera gc'ed en premier, c'est-à-dire que vous ne devriez pas avoir le code de finaliseur en B et C qui dépend de cet ordre. Le GC ne compte pas les références, mais vérifie l'accessibilité. Si B et C ne peuvent pas être atteints, ils sont également inaccessibles. –

4

Comme d'habitude, ce article est un must-read pour quiconque veut comprendre ce que fait la garbage collection. Il est bien écrit et a des dessins explicatifs.

+0

En ouvrant le lien, j'ai besoin d'un nom d'utilisateur et d'un mot de passe. – JordyOnrust

+0

Ah, FTP frappe à nouveau. J'ai édité mon post, avec un autre lien qui devrait mieux fonctionner. Il y a aussi une version PDF. –

+0

@ Bright010957: Tada! https://ritdml.rit.edu/dspace/bitstream/1850/5112/1/PWilsonProceedings1992.pdf –