先上程式碼吧,我的目的是讓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
就行
你自己都說了"我知道java的垃圾回收機制,只有有東西還在引用他,他就不會消失", "new1"這個變數還在引用"new Data()"在堆裡那塊內存,怎麼可能會讓他被回收,這樣我們寫的程式碼不全是空指標異常。你可以使用WeakReference,而不是強引用。
建議JVM執行gc,有可能完全被拒絕。 GC本身是會週期性的自動運行的,由JVM決定運行的時機,而且現在的版本有多種更智能的模式可以選擇,還會根據運行的機器自動去做選擇,就算真的有性能上的需求,也應該去對GC的運行機制進行微調,而不是通過使用這個命令來實現性能的優化。
有物件引用即將刪除的物件仍可以置為null
在你沒有理解JMM原理之前,千萬不要亂用System.gc(),物件用完obj=null;就可以了。
答案是不能,這屬於JVM規範中未定義的行為,開發者不應該試圖手動的去幫助虛擬機器回收一個物件。如果是sun的JDK,好像有一個unsafe的包,不過我沒用過,不知道有沒有這樣的API。