2017-09-29 1 views
-1

De ce post Strong references never be garbage collected, Avec cette compréhension, je suppose que si nous créons un Strong Reference objects infini en mémoire, puis il doit lancer OutOfMemory erreur.Aucune erreur OutOfMemory pour les objets fortement référencés - Pourquoi?

Cependant, lorsque j'ai couru sous le programme fictif, il n'a jamais traversé l'erreur OutOfMemory bien que j'ai créé des objets infinis dans la boucle while.

public class Test2 { 
    public static void main(String[] args) { 
     while (true) { 
      Test2 obj = new Test2(); 
      System.out.println(obj); 
     } 

    } 
} 

S'il vous plaît aidez-moi à comprendre si des objets solides référencés ne sont jamais recueillies alors comment les ordures viennent il n'y a pas d'erreur OOM.

+1

Ils sont recueillis dès qu'ils sortent de la portée; c'est, immédiatement. – shmosel

+0

@ shmosel- Avez-vous lu le message que j'ai joint? Il a 80 Likes sur la réponse, si vous avez quelque chose d'autre s'il vous plaît élaborer en réponse afin que nous puissions comprendre .. s'il vous plaît –

+1

Oui, quel est votre point? Il n'y a pas d'objet de référence fort. Votre code crée de nombreux objets, mais n'alloue qu'une seule référence forte. – shmosel

Répondre

1

Vous ne devez pas garder la référence forte à l'objet. Chaque fois que vous parcourez la boucle, il n'y a plus de référence à l'objet créé lors de la dernière itération et il est éligible pour la récupération de place.

+0

Merci beaucoup ... :) pour la clarification –

1

Les objets ne sont pas collectés si est accessible à partir d'un objet racine GC via des références fortes. Dans votre exemple, un seul objet Test2 est accessible depuis votre thread à tout moment. La référence forte obj est mise à jour à chaque itération et par conséquent, l'objet Test2 précédent n'est plus référencé à partir de n'importe où et peut être récupéré.

Si vous souhaitez créer un MOO, vous pouvez ajouter les nouveaux objets à un List et les y conserver.