Maison  >  Questions et réponses  >  le corps du texte

java类中的成员成员变量赋值之后什么时候会被回收,有什么办法监听到某一个对象被回收吗

java类中的成员成员变量赋值之后什么时候会被回收,有什么办法监听到某一个对象被回收吗

天蓬老师天蓬老师2743 Il y a quelques jours657

répondre à tous(2)je répondrai

  • 阿神

    阿神2017-04-18 10:52:02

    Le fait qu'un objet soit recyclé ne se juge pas simplement en fonction du fait que l'objet actuel est référencé.

    La JVM utilise l'algorithme d'analyse d'accessibilité pour déterminer s'il faut recycler un objet inaccessible par GC ROOT sera marqué si un objet est marqué deux fois, il sera recyclé. Quant à cet algorithme d'analyse d'accessibilité, vous pouvez le rechercher vous-même sur Baidu. Le principe est très simple.

    Alors quelle méthode est utilisée pour contrôler si un objet est recyclé ? Bien sûr, j'ai utilisé fianlize ;

    Veuillez consulter le code :

    public class Test {
        private static Test TEST= null;
        public static void main(String args[]) {
            TEST = new Test();
            TEST = null;
            System.gc();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(TEST);
        }
        @Override
        public void finalize() throws Throwable {
            System.out.println("要死了要死了要死了!");
        } 
    }
    

    Résultat de l'exécution :

    要死了要死了要死了!
    null

    Est-ce que cela signifie qu'après l'exécution de finalize, l'objet sera définitivement recyclé ? En fait, il n'est pas nécessairement vrai que l'objet n'a qu'une seule chance de se sauver lorsque finalize est appelé, comme suit :

    
    public class Test {
        private static Test TEST= null;
        public static void main(String args[]) {
            TEST = new Test();
            
            TEST = null;
            System.gc();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(TEST);
            
            TEST = null;
            System.gc();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(TEST);
        }
        
        @Override
        public void finalize() throws Throwable {
            System.out.println("要死了要死了要死了!");
            TEST = this;
        } 
    }

    Les résultats d'exécution sont les suivants :

    要死了要死了要死了!
    com.Test@1aa9f99
    null

    Vous pouvez voir que lors du premier garbage collection, la méthode finalize attribue une nouvelle référence à l'objet de recyclage actuel pour éviter d'être recyclé. Cependant, la méthode finalize ne peut être appelée qu'une seule fois pour un objet, lors du deuxième recyclage. ne sera pas appelé.

    On peut conclure des deux exemples ci-dessus : finalize peut surveiller un objet à recycler, mais rien ne garantit que l'objet qui appelle finalize sera recyclé. En même temps, un objet ne sera pas marqué. pour le recyclage pour la deuxième fois. Finaliser sera déclenché ! Si vous souhaitez absolument surveiller si un objet est recyclé, vous pouvez uniquement ajouter le paramètre -XX:+PrintGCDetails à la JVM pour analyser le journal GC

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:52:02

    Pas nécessairement quand. N'est-il pas possible d'utiliser le destructeur de cette classe d'objets ?

    répondre
    0
  • Annulerrépondre