java类中的成员成员变量赋值之后什么时候会被回收,有什么办法监听到某一个对象被回收吗
天蓬老师
天蓬老师 2017-04-18 10:50:02
0
2
712

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(2)
阿神

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

巴扎黑

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal