Sama ada objek dikitar semula tidak dinilai hanya dengan sama ada objek semasa dirujuk.
JVM menggunakan algoritma analisis kebolehcapaian untuk menentukan sama ada untuk mengitar semula objek yang tidak boleh dicapai oleh GC ROOT akan ditandakan jika objek ditanda dua kali, ia akan dikitar semula. Bagi algoritma analisis kebolehcapaian ini, anda boleh mencarinya sendiri di Baidu Prinsipnya sangat mudah.
Jadi apakah kaedah yang digunakan untuk memantau sama ada sesuatu objek dikitar semula? Sudah tentu saya menggunakan fianlize;
Sila lihat kod:
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("要死了要死了要死了!");
}
}
Hasil pelaksanaan:
要死了要死了要死了!
null
Adakah ini bermakna selepas melaksanakan muktamad, objek itu pasti akan dikitar semula? Malah, tidak semestinya benar bahawa objek hanya mempunyai satu peluang untuk menyelamatkan dirinya apabila dimuktamadkan dipanggil, seperti berikut:
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;
}
}
Keputusan pelaksanaan adalah seperti berikut:
要死了要死了要死了!
com.Test@1aa9f99
null
Anda boleh melihat bahawa semasa kutipan sampah pertama, kaedah pemuktamadkan memberikan rujukan baharu kepada objek kitar semula semasa untuk mengelakkan daripada dikitar semula Walau bagaimanapun, kaedah pemuktamadkan hanya boleh dipanggil sekali untuk kitar semula kedua akan tidak akan dipanggil.
Daripada dua contoh di atas, kita boleh membuat kesimpulan bahawa finalize boleh memantau objek untuk dikitar semula, tetapi tiada jaminan bahawa objek yang memanggil finalize akan dikitar semula Pada masa yang sama, objek tidak akan ditandakan untuk dikitar semula buat kali kedua. Jika anda ingin memantau sama ada objek dikitar semula, anda hanya boleh menambah parameter -XX:+PrintGCDetails pada JVM untuk menganalisis log GC
Sama ada objek dikitar semula tidak dinilai hanya dengan sama ada objek semasa dirujuk.
JVM menggunakan algoritma analisis kebolehcapaian untuk menentukan sama ada untuk mengitar semula objek yang tidak boleh dicapai oleh GC ROOT akan ditandakan jika objek ditanda dua kali, ia akan dikitar semula. Bagi algoritma analisis kebolehcapaian ini, anda boleh mencarinya sendiri di Baidu Prinsipnya sangat mudah.
Jadi apakah kaedah yang digunakan untuk memantau sama ada sesuatu objek dikitar semula? Sudah tentu saya menggunakan fianlize;
Sila lihat kod:
Hasil pelaksanaan:
Adakah ini bermakna selepas melaksanakan muktamad, objek itu pasti akan dikitar semula? Malah, tidak semestinya benar bahawa objek hanya mempunyai satu peluang untuk menyelamatkan dirinya apabila dimuktamadkan dipanggil, seperti berikut:
Keputusan pelaksanaan adalah seperti berikut:
Anda boleh melihat bahawa semasa kutipan sampah pertama, kaedah pemuktamadkan memberikan rujukan baharu kepada objek kitar semula semasa untuk mengelakkan daripada dikitar semula Walau bagaimanapun, kaedah pemuktamadkan hanya boleh dipanggil sekali untuk kitar semula kedua akan tidak akan dipanggil.
Daripada dua contoh di atas, kita boleh membuat kesimpulan bahawa finalize boleh memantau objek untuk dikitar semula, tetapi tiada jaminan bahawa objek yang memanggil finalize akan dikitar semula Pada masa yang sama, objek tidak akan ditandakan untuk dikitar semula buat kali kedua. Jika anda ingin memantau sama ada objek dikitar semula, anda hanya boleh menambah parameter -XX:+PrintGCDetails pada JVM untuk menganalisis log GC
Tidak semestinya bila. Bukankah mungkin untuk menggunakan pemusnah kelas objek itu?