66 votes

Combien d'objets seront éligibles pour la collecte des ordures après l'exécution de "m1=null; m2=null;"?

Je suis confus pour comprendre après l'exécution d' m1 = null; m2 = null;. Combien d'objets seront éligibles pour la collecte des ordures?

public class MyTest {
    MyTest m;

    void show() {
        System.out.println("Hello this is show method.");
    }

    public static void main(String args[]) {
        MyTest m1 = new MyTest();
        MyTest m2 = new MyTest();
        MyTest m3 = new MyTest();
        m1.m = m2;
        m2.m = m3;
        m3.m = m1;
        m1 = null;
        m2 = null;
        // Question here: How many objects will be eligible for garbage collection?
    }
}

80voto

dasblinkenlight Points 264350

Zéro.

La référence d'objet diagramme ressemble à ceci:

Circular

Vous pouvez voir que la référence est la circulaire. Une référence à partir d' main de m3 garde l' m3 objet vivant. À son tour, m3 maintient vivante m1, ce qui maintient m2 de GC.

Notez que si vous définissez m3 de null, tous les trois objets deviendraient admissibles pour le GC, à la fois, malgré les références circulaires existantes pour chacun d'eux. GC est assez intelligent pour comprendre que toutes les références sont à venir à partir de GC admissibles à des objets, et de recueillir tous les trois.

24voto

Joshua Points 13231

Potentiellement, tous les 3 d'entre eux. Pas de variables sont référencées après l' // marqueur, de sorte que l'optimiseur est dans son droit de déposer l'image à ce point.

21voto

rakeb.mazharul Points 4529

Voila! GC recueillera plus rien ici! Nous allons voir ce qui se passe ici. Lorsque vous avez créé trois objets d' m1, m2 et m3 de MyTest, l'objet a été créé comme ci-dessous (dire que l'objet de référence id commence à partir de 410):

m1    MyTest  (id=410)
    m    null
m2    MyTest  (id=412)
    m    null
m3    MyTest  (id=414)
    m    null

Lorsque vous initialisez

m1.m = m2;
m2.m = m3;
m3.m = m1;

Les objets sont ressemble maintenant à:

m1    MyTest  (id=410)
    m    MyTest  (id=412)
m2    MyTest  (id=412)
    m    MyTest  (id=414)
m3    MyTest  (id=414)
    m    MyTest  (id=410)
        m    MyTest  (id=412)
            m    MyTest  (id=414)
                m    MyTest  (id=410)
                    .
                    .
                    . (This is circular)

Mais après avoir réinitialisé m1 et m2 de null, les objets ressembler à:

m1    null
m2    null
m3    MyTest  (id=414)
    m    MyTest  (id=410)
        m    MyTest  (id=412)
            m    MyTest  (id=414)
                m    MyTest  (id=410)
                .
                .
                .

Regardez, m1 et m2 sont null maintenant, mais leurs références sont encore en vie en m3!

9voto

Aron_dc Points 763

Aucun car ils sont encore tous accessibles par le biais de la circulaire de référence vous y construire par m3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X