2017-07-20 2 views
0

On m'a récemment posé une question sur Garbage Collection dans JAVA. Il va comme-si j'ai trois variable (disons), a, b, c comme indiqué ci-dessous. Ensuite, dans quel ordre ces déchets seront-ils récupérés.Entretien sur la collecte des ordures en Java

class Test{ 

static String a; 

private String b; 

Test(String a, String b) 

{ 
    this.a=a; 
    this.b=b; 
} 

void disp(){ 

    System.out.println(a+" "+ b); 
} 

public static void main(String[] args){ 

    String c="Not you Again"; 
    Test t= new Test("Hello","World"); 

    t.disp(); 
    System.out.println("Value of c = "+c); 
} 

} 

Je suis au courant des bases de collecte des ordures comme jeune génération, Moyen Gen & Perm Gen et la façon dont les objets sont déplacés entre eux et recueillis. Mais la collecte des ordures sur les variables est quelque chose que je suis étranger à. S'il vous plaît aider!

+0

** Les variables ** ne sont pas collectées. ** Les objets ** sont collectés. Puisque les trois variables sont du type primitif 'int' (qui n'est pas un objet), cette question n'a pas beaucoup de sens. – Jesper

+0

@SarveshGupta un 'int' n'est pas un objet. il ne peut pas être ramassé. – Moira

+0

comment ceci: 'this.a = a;' a-t-il raison? – Edwin

Répondre

0

Les valeurs référencées par Test.a, t.b ou c ne seront jamais les ordures collectées, parce qu'ils sont tous encore dans la portée lorsque main finitions en cours d'exécution. Autrement dit, la machine virtuelle se ferme sans que les ordures ne soient collectées. En ce qui concerne les paramètres a et b du constructeur Test, ils pourraient éventuellement être collectés, mais cela est très improbable. Ce programme particulier va finir trop vite pour que le ramasse-miettes puisse même commencer.

+0

Le deuxième paragraphe est un non-sens. Les paramètres du constructeur 'Test' sont des variables locales et les variables ne sont pas du tout collectées. * Les Objets * récupèrent les ordures et les objets qui ont été référencés par les paramètres constructeurs sont toujours référencés par d'autres variables qui, comme votre premier paragraphe l'a déjà dit, sont toujours dans la portée. Votre réponse a commencé si bien en se référant à "* les valeurs référencées par *' Test.a ",' tb' ou 'c' ..." et a ensuite ce deuxième paragraphe contradictoire parlant de la collection de * paramètres *, qui ne sont pas des valeurs , mais des références. – Holger

+0

@Holger Je pense que la signification dans le deuxième paragraphe est claire - ce sont les objets référencés par ces paramètres qui pourraient (mais ne reçoivent probablement pas) obtenir garbage collecté. –

+0

bien, dans ce cas, c'est complètement faux, car ces objets sont, comme dit, les mêmes objets que vous déclarez correctement comme non collectionnables dans le premier paragraphe. C'est exactement le problème de dire des choses absurdes comme «les paramètres ... pourraient éventuellement être collectés», car le paramètre ne peut pas être collecté, seuls les objets peuvent le faire et ces objets spécifiques ne peuvent pas être collectés. – Holger

1

Toutes les trois variables de chaîne seront collectées à la poubelle quand la machine virtuelle satisfera, si jamais cela plaît, et personne n'a de contrôle sur cela. Toute personne prétendant savoir quand et même si ces chaînes seront ramassées dans les ordures ment.

+0

J'ai dit un peu la même chose mais il a dit que les qualificatifs statiques et privés n'affecteront pas la collection. –

+0

Étant donné que les membres statiques sont stockés dans une zone permanente, ils ne seront pas les derniers à être collectés. Aidez-moi, s'il vous plaît! –

+0

@Sarvesh Gupta: pour simplifier, c'est une connerie. Comme déjà dit dans [ce premier commentaire] (https://stackoverflow.com/questions/45207618/interview-on-garbage-collection-in-java#comment77381302_45207618), les variables ne sont pas collectées, les objets le sont. Et comme un objet peut être référencé par un nombre arbitraire de variables de types différents, le type de la variable est totalement non pertinent. L'emplacement de mémoire d'un objet ne change pas brusquement lorsque vous y stockez une référence dans une variable 'static'. En Java 8, il n'y a même pas de zone perm gen. – Holger

0

Garbage collector ne fonctionnera jamais dans cet exemple particulier. Garbage collector s'exécute uniquement lorsqu'il n'y a pas de thread actif actif, dans cet exemple, il n'y a pas de thread mort, garbage collector ne sera jamais exécuté. Garbage collector est activé par JVM uniquement et nous ne pouvons pas le contrôler, bien que nous puissions simplement faire une demande pour l'exécuter, cette demande peut être ignorée par JVM.