生活随笔
收集整理的這篇文章主要介紹了
垃圾回收与垃圾收集算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
概述
可回收的條件
堆區(qū)可回收的條件
方法區(qū)可回收的條件
垃圾收集算法
理論支持
追蹤式垃圾收集常見(jiàn)算法
標(biāo)記-清除算法
標(biāo)記-復(fù)制算法
標(biāo)記-整理算法
概述
線程共享的內(nèi)存區(qū)需要內(nèi)存的分配和回收:Java堆和方法區(qū)
可回收的條件
堆區(qū)可回收的條件
堆中的回收對(duì)象是不再存活的實(shí)例,Java中判斷對(duì)象是否存活,同時(shí)滿足以下條件
對(duì)象不再存活 使用可達(dá)性分析算法判定對(duì)象是否存活 從GC Roots到被判斷的對(duì)象不可達(dá)時(shí),證明對(duì)象是不再被引用的可以固定作為GC Roots的對(duì)象包括以下幾種(可不看) 在虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象,如當(dāng)前正在運(yùn)行的方法所使用到的參數(shù)、局部變量、臨時(shí)變量等在方法區(qū)中常量引用的對(duì)象,如字符串常量池里的引用在方法區(qū)中類靜態(tài)屬性引用的對(duì)象,如Java類的引用類型靜態(tài)變量想起來(lái)再補(bǔ)充吧finalize方法沒(méi)有被重寫(xiě)或者已經(jīng)被調(diào)用過(guò)一次 finalize已經(jīng)被官方明確為不推薦使用的方法
方法區(qū)可回收的條件
方法區(qū)中主要回收的內(nèi)容
廢棄常量 無(wú)引用,即是否廢棄垃圾收集器判斷有必要 判斷標(biāo)準(zhǔn)p74不再使用的類型(滿足后被允許回收,不一定回收) 所有的實(shí)例都已回收該類的類加載器已回收java.lang.Class對(duì)象沒(méi)有在任何地方被引用,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類的方法
? ? ? ? 總結(jié):性價(jià)比低,條件苛刻
垃圾收集算法
理論支持
當(dāng)前商業(yè)虛擬機(jī)的垃圾收集器大多遵循分代收集理論進(jìn)行設(shè)計(jì),理論建立在以下假說(shuō)上
弱分代假說(shuō):絕大多數(shù)對(duì)象都是朝生夕滅強(qiáng)分代假說(shuō):熬過(guò)越多次垃圾收集過(guò)程的對(duì)象就越難消亡跨代引用假說(shuō):跨代引用相對(duì)于同代引用來(lái)說(shuō)占極少數(shù),跨著跨著一起老不死了
追蹤式垃圾收集常見(jiàn)算法
標(biāo)記-清除算法
最基礎(chǔ)的垃圾收集算法,標(biāo)記過(guò)程即對(duì)象是否始于垃圾的判定過(guò)程
回收過(guò)程
統(tǒng)一標(biāo)記需要回收的對(duì)象統(tǒng)一回收
缺點(diǎn)
執(zhí)行效率不穩(wěn)定 堆中有大量對(duì)象,大部分需要被回收,必須進(jìn)行大量的標(biāo)記和清除動(dòng)作,導(dǎo)致清除和標(biāo)記兩個(gè)過(guò)程的執(zhí)行效率都隨著對(duì)象數(shù)量增長(zhǎng)而降低導(dǎo)致內(nèi)存空間碎片化 標(biāo)記清除后會(huì)有大量不連續(xù)的內(nèi)存碎片
標(biāo)記-復(fù)制算法
常用于新生代回收,新生代存活的少
回收過(guò)程
將可用內(nèi)存按容量分成大小相等的兩塊,每次只使用一塊,這一塊內(nèi)存用完后開(kāi)始垃圾收集
將還存活的對(duì)象復(fù)制到另一塊上將已使用過(guò)的內(nèi)存空間一次性清除
優(yōu)點(diǎn):
實(shí)現(xiàn)簡(jiǎn)單運(yùn)行高效不需要考慮空間碎片
缺點(diǎn):
內(nèi)存縮小為原來(lái)的一半產(chǎn)生大量的內(nèi)存復(fù)制的開(kāi)銷
Appel式回收
優(yōu)化半?yún)^(qū)復(fù)制分代策略,內(nèi)存這樣劃分:新生代=Eden空間+Survivor空間*2,其中Eden空間和Survivor空間大小比例為8:1(HotSpot中);每次分配內(nèi)存只使用Eden和一塊Survivor空間,發(fā)生垃圾收集時(shí)?
將Eden和Survivor空間中存活的對(duì)象一次性復(fù)制到另一塊Survivor上清除Eden和已使用的Survivor
????????由此,每次新生代中可以使用的空間是整個(gè)新生代的90%,如果存活的對(duì)象超過(guò)10%,依賴其他內(nèi)存區(qū)域進(jìn)行分配擔(dān)保,實(shí)際上大多數(shù)就是老年代
標(biāo)記-整理算法
常用于老年代回收
回收過(guò)程
標(biāo)記存活的對(duì)象讓所有存活的對(duì)象向內(nèi)存空間的一側(cè)移動(dòng)清除掉邊界以外的內(nèi)存
缺點(diǎn):
移動(dòng)對(duì)象代價(jià)大 老年代中每次回收都有大量存活的對(duì)象,移動(dòng)存活對(duì)象并更新所有引用這些對(duì)象的地方是極為負(fù)重的操作對(duì)象移動(dòng)操作時(shí)必須全程暫停用戶應(yīng)用程序才可,俗稱:stop the world
優(yōu)點(diǎn):
沒(méi)有碎片化,內(nèi)存分配簡(jiǎn)單 相對(duì)不移動(dòng)來(lái)說(shuō)是個(gè)優(yōu)點(diǎn)?
????????和稀泥式,平時(shí)使用普通標(biāo)記-清除,暫時(shí)容忍碎片存在,直到內(nèi)存空間的碎片化程度已經(jīng)達(dá)到影響對(duì)象分配時(shí)再使用標(biāo)記-整理算法收集一次
總結(jié)
以上是生活随笔為你收集整理的垃圾回收与垃圾收集算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。