垃圾回收 - java 如何手動回收對象
問題描述
先上代碼吧,我的目的是讓data這個數(shù)據(jù)徹底消失
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異常,即徹底沒有這個數(shù)據(jù) 不要說讓new1=null就行
問題解答
回答1:你自己都說了'我知道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);回答2:
System.gc();
建議JVM執(zhí)行gc,有可能完全被拒絕。 GC本身是會周期性的自動運行的,由JVM決定運行的時機,而且現(xiàn)在的版本有多種更智能的模式可以選擇,還會根據(jù)運行的機器自動去做選擇,就算真的有性能上的需求,也應該去對GC的運行機制進行微調,而不是通過使用這個命令來實現(xiàn)性能的優(yōu)化。
回答3:有對象引用即將刪除的對象仍然可以置為null
{OutClass outClass1 = new OutClass();OutClass outClass2 = new OutClass();outClass2.outClass = outClass1;outClass1 = null;System.out.print(outClass1); }class OutClass {public OutClass outClass; }回答4:
在你沒有理解JMM原理之前,千萬不要亂用System.gc(),對象用完obj=null;就可以了。
回答5:答案是不能,這屬于JVM規(guī)范中未定義的行為,開發(fā)者不應該試圖手動的去幫助虛擬機回收一個對象。如果是sun的JDK,好像有一個unsafe的包,不過我沒用過,不知道有沒有這樣的API。
相關文章:
1. html5 - datatables 加載不出來數(shù)據(jù)。2. node.js - mongodb查找子對象的名稱為某個值的對象的方法3. 測試自動化html元素選擇器元素ID或DataAttribute [關閉]4. html5和Flash對抗是什么情況?5. javascript - QQ第三方登錄的問題6. 運行python程序時出現(xiàn)“應用程序發(fā)生異常”的內存錯誤?7. 利用IPMI遠程安裝centos報錯!8. java - Spring boot 讀取 放在 jar 包外的,log4j 配置文件,系統(tǒng)有創(chuàng)建日志文件,不寫入日志信息。9. spring-mvc - spring-session-redis HttpSessionListener失效10. 正在使用electron和node.js做桌面應用,需要實時監(jiān)聽是否有網(wǎng)絡連接,node或者electron是否可以做到

網(wǎng)公網(wǎng)安備