9
votes

Question sur la collecte des ordures à Java

Supposons que j'ai une liste doublement liée. Je le crée comme tel: xxx pré>

Puis j'ajoute quelques nœuds, l'utiliser et ensuite décider de jeter l'ancienne liste comme ceci: P>

list = new MyList();


7 Réponses :


13
votes

Non, vous ne le faites pas. Le Java GC gère des références cycliques très bien.

Conceptuellement, chaque fois que le GC fonctionne, il examine toutes les références racines "en direct" dans le système:

  • Variables locales dans chaque cadre de pile
  • "Cette" références dans chaque méthode d'instance Cadre de pile
  • Effectivement, toutes les variables statiques (elles sont en fait référencées par des objets , qui sont à son tour référencés par classier s, mais ignorons cela pour le moment. )

    Avec ces objets "connus en direct", il examine les champs d'entre eux, ajoutant à la liste. Il recouvre dans ces objets référencés, et ainsi de suite, jusqu'à ce que cela puisse trouver tous les objets en direct dans le système. Il rassemble alors tout ce qu'il n'a pas jugé à vivre.

    Vos nœuds de référence cycliquement référencés se réfèrent à l'autre, mais aucun objet en direct ne lui fait référence, afin qu'ils soient éligibles pour la collecte des ordures.

    Notez que ceci est un résumé simplifié de la manière dont un collecteur de déchets conceptuellement fonctionne. En réalité, ils sont extrêmement compliqués, avec des générations, un compactage, des problèmes de concurrence et similaires.


0 commentaires

-1
votes

Le collecteur des ordures recherche des objets qui ne sont référencés nulle part. Donc, si vous créez un objet et que vous perdez la référence comme l'exemple, le collecteur des ordures collectera ceci.


0 commentaires

0
votes

Non - Java (au moins comme normalement implémenté) n'utilise pas de comptage de référence, il utilise un véritable collecteur à ordures. Cela signifie (en substance) lorsqu'il manque de mémoire, il regarde les pointeurs sur la pile, dans des registres et d'autres endroits toujours accessibles et "chasser les" pour trouver tout ce qui est accessible d'eux.

Les pointeurs dans d'autres structures de données telles que votre liste doublement liée ne comptent tout simplement pas d'importance à moins qu'il y ait du pointeur extérieur (c'est accessible) qui leur conduit.


0 commentaires

0
votes

Non, le GC les récupérera de toute façon donc vous n'avez pas besoin de les signaler à NULL. Voici une bonne description du paragraphe de ce javaworld Article :

Tout algorithme de collecte des ordures doit faire deux choses de base. Tout d'abord, il doit Détecter les objets à ordures. Deuxièmement, ça doit récupérer l'espace de tas utilisé par les objets à ordures et le faire disponible pour le programme. Des ordures la détection est habituellement accomplie En définissant un ensemble de racines et déterminer l'accessibilité de la racines. Un objet est accessible si là est un chemin des références de la racines par lesquelles le programme d'exécution peut accéder à l'objet. Les racines sont toujours accessible au programme. Tout objets qui sont accessibles de la Les racines sont considérées comme en direct. Objets qui ne sont pas accessibles sont considérés poubelles, parce qu'ils ne peuvent plus affecter le programme futur du programme Exécution.


0 commentaires

0
votes

Le collecteur des ordures ressemble si des objets sont référencés par des threads en direct. Si des objets ne sont pas accessibles par des threads vivants, ils sont éligibles pour la collecte des ordures.

Peu importe si les objets se réfèrent à l'autre.


0 commentaires

0
votes

Comme d'autres l'ont souligné, le collecteur de poubelles Java ne regarde pas simplement le comptage de référence; Au lieu de cela, il examine essentiellement un graphique où les nœuds sont les objets qui existent actuellement et que des liens sont une référence d'un objet à un autre. Il commence à partir d'un nœud connu pour être en direct (la méthode principale, par exemple), puis les ordures recouvrent tout ce qui ne peut être atteint.

L'article Wikipedia sur la collection de déchets discute de diverses façons que cela puisse être fait, même si je ne sais pas exactement quelle méthode est utilisée par l'une des implémentations JVM.


0 commentaires

1
votes

Si vous avez créé votre propre liste à double liaison, vous mettez dans cette double liste de récipients de liste (qui contiennent des éléments de votre liste); Seuls les conteneurs sont liés l'un à l'autre.

Donc, dans votre liste, vous aurez un objet un objet contenu dans un '. A 'est lié à B' et B 'est un conteneur qui maintient B, et aucun de l'objet n'a à référencer un autre.

Dans un cas normal, ces conteneurs ne seront pas disponibles à l'extérieur (seul le contenu est intéressant); Donc, seule votre liste aura des références à vos conteneurs (rappelez-vous que votre contenu n'est pas au courant de son conteneur).

Si vous supprimez votre dernière référence à votre liste (la liste, pas le conteneur, ni le contenu), le GC tentera de collecter votre contenu de liste, Sorcière est vos conteneurs et votre contenu.

Étant donné que vos conteneurs ne sont pas disponibles en dehors de la seule référence, ils sont l'un de l'autre et la liste principale. Tout cela s'appelle une île d'isolation . En ce qui concerne le contenu, s'ils ont toujours des références dans votre application, ils survivront à la GC, sinon ils ne le feront pas.

Alors, lorsque vous supprimez votre liste seulement un «et B» sera supprimé car même si elles ont toujours des références, ces références font partie d'une île. Si A et B n'ont plus de références, elles seront supprimées aussi.


0 commentaires