Pengumpulan Sampah - Bagaimana untuk mengumpul objek secara manual dalam java
为情所困
为情所困 2017-05-17 10:05:31
0
5
1042

Mari mulakan dengan kod terlebih dahulu Matlamat saya adalah untuk membuat data hilang sepenuhnya

public class Test {
    public static void main(String[] args) {
        Data data = new Data();
        data.num = 10;

        Data new1 = data;
        Data new2 = data;
        new2 = null;
        data = null;
        System.out.println(new1.num);
    }

}

class Data {
    int num;
}

Saya tahu mekanisme pengumpulan sampah Java Selagi ada sesuatu yang merujuknya, kod di atas masih boleh mengeluarkan 10 seperti biasa. .num); membuang pengecualian null, yang bermaksud tiada data sedemikian sama sekali
Jangan katakan hanya biarkan new1=null baik-baik sajaSystem.out.println(new1.num);抛出null异常,即彻底没有这个数据
不要说让new1=null

为情所困
为情所困

membalas semua(5)
迷茫

Anda sendiri yang mengatakannya, "Saya tahu mekanisme pengumpulan sampah Java. Selagi sesuatu masih merujuknya, ia tidak akan hilang." , bagaimana ia boleh dibenarkan untuk dikitar semula, supaya kod yang kami tulis bukan semua pengecualian penunjuk nol. Anda boleh menggunakan WeakReference dan bukannya rujukan yang kuat.

    WeakReference<Data> new1 = new WeakReference(data);
    Data new2 = data;
    new2 = null;
    data = null;
    System.gc();//告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 ,所以下面延迟2秒
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println(new1.get().num);
我想大声告诉你
System.gc();

Adalah disyorkan bahawa JVM melakukan gc, yang mungkin ditolak sepenuhnya. GC itu sendiri akan berjalan secara automatik secara berkala, dan JVM menentukan masa larian Selain itu, versi semasa mempunyai pelbagai mod yang lebih pintar untuk dipilih, dan secara automatik akan membuat pilihan berdasarkan mesin yang sedang dijalankan, walaupun terdapat. sememangnya peningkatan prestasi Jika perlu, anda juga harus memperhalusi mekanisme pengendalian GC dan bukannya mengoptimumkan prestasi dengan menggunakan arahan ini.

Ty80

Objek yang mempunyai rujukan objek dan akan dipadamkan masih boleh ditetapkan kepada null

    {
        OutClass outClass1 = new OutClass();
        OutClass outClass2 = new OutClass();
        outClass2.outClass = outClass1;
        outClass1 = null;
        System.out.print(outClass1);
    }
    
    class OutClass {
        public OutClass outClass;
    }
左手右手慢动作

Sebelum anda memahami prinsip JMM, jangan sekali-kali menggunakan System.gc() secara sembarangan, hanya obj=null apabila objek itu habis;

滿天的星座

Jawapannya ialah tidak. Ini adalah tingkah laku yang tidak ditentukan dalam spesifikasi JVM. Pembangun tidak boleh cuba membantu mesin maya mengitar semula objek secara manual. Jika ia JDK Sun, nampaknya ada pakej yang tidak selamat, tetapi saya tidak pernah menggunakannya dan saya tidak tahu sama ada terdapat API sedemikian.

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