垃圾回收 - java 如何手動回收對象
为情所困
为情所困 2017-05-17 10:05:31
0
5
1078

先上程式碼吧,我的目的是讓data這個資料徹底消失

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;
}

我知道java的垃圾回收機制,只有有東西還在引用他,他就不會消失,像上面的程式碼依然能夠正常輸出10.
但是我想知道該怎麼做,能讓System.out.println(new1.num);拋出null異常,即完全沒有這個資料
不要說讓new1=null就行

为情所困
为情所困

全部回覆(5)
迷茫

你自己都說了"我知道java的垃圾回收機制,只有有東西還在引用他,他就不會消失", "new1"這個變數還在引用"new Data()"在堆裡那塊內存,怎麼可能會讓他被回收,這樣我們寫的程式碼不全是空指標異常。你可以使用WeakReference,而不是強引用。

    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();

建議JVM執行gc,有可能完全被拒絕。 GC本身是會週期性的自動運行的,由JVM決定運行的時機,而且現在的版本有多種更智能的模式可以選擇,還會根據運行的機器自動去做選擇,就算真的有性能上的需求,也應該去對GC的運行機制進行微調,而不是通過使用這個命令來實現性能的優化。

Ty80

有物件引用即將刪除的物件仍可以置為null

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

在你沒有理解JMM原理之前,千萬不要亂用System.gc(),物件用完obj=null;就可以了。

滿天的星座

答案是不能,這屬於JVM規範中未定義的行為,開發者不應該試圖手動的去幫助虛擬機器回收一個物件。如果是sun的JDK,好像有一個unsafe的包,不過我沒用過,不知道有沒有這樣的API。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板