Maison > Questions et réponses > le corps du texte
java类中的成员成员变量赋值之后什么时候会被回收,有什么办法监听到某一个对象被回收吗
阿神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
巴扎黑2017-04-18 10:52:02
Pas nécessairement quand. N'est-il pas possible d'utiliser le destructeur de cette classe d'objets ?