手動(dòng)調(diào)用 System.gc(); 就是調(diào)用垃圾回收 如果不手動(dòng)調(diào)用的話,JVM會(huì)不定期調(diào)用gc()方法 JVM查找到?jīng)]有指向的堆空間內(nèi)存,進(jìn)行釋放。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),賓川企業(yè)網(wǎng)站建設(shè),賓川品牌網(wǎng)站建設(shè),網(wǎng)站定制,賓川網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,賓川網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
根據(jù)清除算法,整理算法,復(fù)制算法,分代算法進(jìn)行清除。
清除算法為標(biāo)記無用對(duì)象,然后進(jìn)行清除回收,缺點(diǎn)為效率不高,無法清除垃圾碎片。
整理算法是標(biāo)記無用對(duì)象,讓所有存活的對(duì)象都向一端移動(dòng),然后直接清除掉端邊界以外的內(nèi)存。
復(fù)制算法是按照容量劃分二個(gè)大小相等的內(nèi)存區(qū)域,當(dāng)一塊用完的時(shí)候?qū)⒒钪膶?duì)象復(fù)制到另一塊上,然后再把已使用的內(nèi)存空間一次清理掉。缺點(diǎn)是內(nèi)存使用率不高,只有原來的一半。
分代算法是根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊,一般是新生代和老年代,新生代基本采用復(fù)制算法,老年代采用標(biāo)記整理算法。
一、Java提供finalize()方法,垃圾回收器準(zhǔn)備釋放內(nèi)存的時(shí)候,會(huì)先調(diào)用finalize()。
(1).對(duì)象不一定會(huì)被回收。
(2).垃圾回收不是析構(gòu)函數(shù)。
(3).垃圾回收只與內(nèi)存有關(guān)。
(4).垃圾回收和finalize()都是靠不住的,只要JVM還沒有快到耗盡內(nèi)存的地步,它是不會(huì)浪費(fèi)時(shí)間進(jìn)行垃圾回收的。
二、垃圾回收器:
1、在 Java 中,當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),Java 虛擬機(jī)(JVM)為該對(duì)象分配內(nèi)存、調(diào)用構(gòu)造函數(shù)并開始跟蹤你使用的對(duì)象。當(dāng)停止使用一個(gè)對(duì)象(就是說,當(dāng)沒有對(duì)該對(duì)象有效的引用時(shí)),JVM 通過垃圾回收器將該對(duì)象標(biāo)記為釋放狀態(tài)。
2、當(dāng)垃圾回收器將要釋放一個(gè)對(duì)象的內(nèi)存時(shí),調(diào)用該對(duì)象的finalize() 方法(如果該對(duì)象定義了此方法)。垃圾回收器以獨(dú)立的低優(yōu)先級(jí)的方式運(yùn)行,只有當(dāng)其線程掛起等待該內(nèi)存釋放的情況出現(xiàn)時(shí),才開始運(yùn)行釋放對(duì)象的內(nèi)存。(事實(shí)上,可以調(diào)用System.gc() 方法強(qiáng)制垃圾回收器來釋放這些對(duì)象的內(nèi)存。)
3、在以上的描述中,有一些重要的事情需要注意。首先,只有當(dāng)垃圾回收器釋放該對(duì)象的內(nèi)存時(shí),才會(huì)執(zhí)行finalize()。如果在 Applet 或應(yīng)用程序退出之前垃圾回收器沒有釋放內(nèi)存,垃圾回收器將不會(huì)調(diào)用finalize()。
三、finalize()方法的優(yōu)缺點(diǎn):
1、根據(jù) Java 文檔,finalize() 是一個(gè)用于釋放非 Java 資源的方法。但是,JVM 有很大的可能不調(diào)用對(duì)象的finalize() 方法,因此很難證明使用該方法釋放資源是有效的。
2、Java 1.1 通過提供一個(gè)System.runFinalizersOnExit() 方法部分地解決了這個(gè)問題。(不要將這個(gè)方法與 Java 1.0 中的System.runFinalizations() 方法相混淆。)不象System.gc() 方法那樣,System.runFinalizersOnExit() 方法
總結(jié):并不立即試圖啟動(dòng)垃圾回收器。而是當(dāng)應(yīng)用程序或 Applet 退出時(shí),調(diào)用每個(gè)對(duì)象的finalize() 方法。
用編程的方式,可以要求(記住這只是一個(gè)請(qǐng)求——不是一個(gè)命令)JVM通過調(diào)用System.gc()方法來運(yùn)行垃圾回收。
當(dāng)內(nèi)存已滿,且堆上沒有對(duì)象可用于垃圾回收時(shí),JVM可能會(huì)拋出OutOfMemoryException。
對(duì)象在被垃圾回收從堆上刪除之前,會(huì)運(yùn)行finalize()方法。還是不要用finalize()方法寫任何代碼。