搜尋

首頁  >  問答  >  主體

垃圾回收 - java 如何手動回收對象

先上程式碼吧,我的目的是讓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就行

为情所困为情所困2753 天前1053

全部回覆(5)我來回復

  • 迷茫

    迷茫2017-05-17 10:07:31

    你自己都說了"我知道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);

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-17 10:07:31

    System.gc();

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-17 10:07:31

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

        {
            OutClass outClass1 = new OutClass();
            OutClass outClass2 = new OutClass();
            outClass2.outClass = outClass1;
            outClass1 = null;
            System.out.print(outClass1);
        }
        
        class OutClass {
            public OutClass outClass;
        }

    回覆
    0
  • ringa_lee

    ringa_lee2017-05-17 10:07:31

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

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-17 10:07:31

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

    回覆
    0
  • 取消回覆