先上程式碼吧,我的目的是讓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
就行
迷茫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);
我想大声告诉你2017-05-17 10:07:31
System.gc();
建議JVM執行gc,有可能完全被拒絕。 GC本身是會週期性的自動運行的,由JVM決定運行的時機,而且現在的版本有多種更智能的模式可以選擇,還會根據運行的機器自動去做選擇,就算真的有性能上的需求,也應該去對GC的運行機制進行微調,而不是通過使用這個命令來實現性能的優化。
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;
}
滿天的星座2017-05-17 10:07:31
答案是不能,這屬於JVM規範中未定義的行為,開發者不應該試圖手動的去幫助虛擬機器回收一個物件。如果是sun的JDK,好像有一個unsafe的包,不過我沒用過,不知道有沒有這樣的API。