Rumah  >  Soal Jawab  >  teks badan

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

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

天蓬老师天蓬老师2743 hari yang lalu666

membalas semua(2)saya akan balas

  • 阿神

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

    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

    balas
    0
  • 巴扎黑

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

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

    balas
    0
  • Batalbalas