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: 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? P> La portée de la question n'est limitée que pour les objets de base créés. Dans pour code> boucle, envisagez que cette méthode renvoie la référence de la liste au monde extérieur. p> p>
4 Réponses :
Le boss code> code> ne sera pas collecté par le garbagécollecteur code> car ils sont toujours référencés dans le bloc de code que vous êtes affiché. 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. P>
edit: strong> 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. P> BossList code> est un
ArrayList code> qui dispose d'une matrice interne de
objet code> détenant des références à ces objets qui y sont ajoutés. P>
Mais puisque la liste
Correct. Dès que le bloc dans lequel la liste code> 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
@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.
ArrayList a Objet [] ElementData Code> en interne. Lorsque vous avez ajouté
B code> à
Bosslist code> ArrayList attribué
elementdata [0] = B code>. Donc, lorsque vous avez attribué
null code> à
B code> L'instance de
boss code> est toujours référencée à partir de
elementdata [0] code> et ne peut pas être Ged. Mais puisque que
ArrayList code> est référencé uniquement à partir de la variable de méthode après que la méthode renvoie à la fois
arraylist code> et
boss code> des instances seront éligibles pour GC. P>
Étant donné que Java passe par référence, chaque fois que vous ajoutez B code> à
Bosslist code>,
Bosslist code> commence à référencer l'emplacement de la mémoire qui pointe sur. Donc, lorsque
B code> Le seul lien annulifié de
B code> à la référence est cassé. Garder l'objet accessible via
Bosslist code>. P>
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 code>.
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.