7
votes

Cet objet Java est-il éligible pour la collecte des ordures dans la liste

Qu'est-ce que je demande peut-être être une question stupide alors s'il vous plaît, pardonnez-moi pour cela. Donc, cela va comme ça: XXX

Donc, dans le scénario ci-dessus, je crée beaucoup d'objets de patron, puis je les référencez-les (je sais que je n'ai pas besoin d'écrire "b = null" , mais je l'ai fait pour la clarté de ma question). Dans le scénario normal, je les aurais marqué à la collecte des ordures, en faisant cela, mais parce que dans ce scénario, j'ajoute que ces objets Boss dans la collection de la liste sont-ils marqués pour GC ou non? Sinon alors pourquoi? Et comment la collecte de la liste fonctionne-t-elle à l'intérieur pour contenir des références pour chaque objet ajouté, de manière à éviter la collecte des ordures? xxx

La portée de la question n'est limitée que pour les objets de base créés. Dans pour boucle, envisagez que cette méthode renvoie la référence de la liste au monde extérieur.


2 commentaires

L'objet lui-même, que vous mettez dans la liste, n'est évidemment pas disponible pour GC puisqu'une référence existe toujours, même si vous annulez B .


Un objet ne peut pas être recruté pour que l'état actuel du programme soit atteint (à l'exclusion de la faiblesse de la classe spéciale et de ses classes associées). Une référence, peu importe où, du code en direct suffit.


4 Réponses :


10
votes

Le boss ne sera pas collecté par le garbagécollecteur car ils sont toujours référencés dans le bloc de code que vous êtes affiché. BossList est un ArrayList qui dispose d'une matrice interne de objet détenant des références à ces objets qui y sont ajoutés.

i une telle situation non seulement les références de votre part sont considérées mais toutes les références de tous les objets concernés.

edit: Depuis que vous retournez la liste dans votre code, les objets ne seront pas marqués pour la collecte des ordures jusqu'à ce que la liste ne soit plus référencée dans votre programme.


8 commentaires

Mais puisque la liste est déclarée à l'intérieur de la méthode, puis lorsque la méthode se termine, la liste serait marquée pour GC, ainsi que les références d'objet boss seront marquées comme bien.


Correct. Dès que le bloc dans lequel la liste déclarée est déclarée terminer tous les objets seront collectés (sinon non référencés).


Bien sûr, si vous supposez que la liste n'existe que dans la méthode.


@ System32 Si ces objets ne sont pas référencés dans une autre partie de votre programme, ils seront marqués pour GC.


Si la liste est renvoyée par la méthode sur le monde extérieur, puis cela ne sera pas géré. Bien sûr, le point de question ne vise pas à la liste objet, mais plutôt aux objets du patron créés dans la boucle.


@Daniellerps alors vous devez préciser que dans votre réponse, car op n'a pas défini ceci dans la question.


Édité la réponse en fonction des suggestions de Bheeshgurung et de Luiggimendoza et de la question mise à jour.


@Daniellerps En règle générale, aucun objet, aucun objet ne sera admissible à GC jusqu'à ce qu'il y ait un lien vers celui-ci (directement ou par d'autres objets) dans n'importe quelle pile existante.



5
votes

ArrayList a Objet [] ElementData en interne. Lorsque vous avez ajouté B à Bosslist ArrayList attribué elementdata [0] = B . Donc, lorsque vous avez attribué null à B L'instance de boss est toujours référencée à partir de elementdata [0] et ne peut pas être Ged. Mais puisque que ArrayList est référencé uniquement à partir de la variable de méthode après que la méthode renvoie à la fois arraylist et boss des instances seront éligibles pour GC.


0 commentaires

3
votes

Voici ce qui arrive vraiment avec votre code:

 bonjour


0 commentaires

-1
votes

Étant donné que Java passe par référence, chaque fois que vous ajoutez B à Bosslist , Bosslist commence à référencer l'emplacement de la mémoire qui pointe sur. Donc, lorsque B Le seul lien annulifié de B à la référence est cassé. Garder l'objet accessible via Bosslist .


0 commentaires