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

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

天蓬老师
天蓬老师

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

membalas semua(2)
阿神

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

巴扎黑

Tidak semestinya bila. Bukankah mungkin untuk menggunakan pemusnah kelas objek itu?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan