JVM之垃圾收集算法
生活随笔
收集整理的這篇文章主要介紹了
JVM之垃圾收集算法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在C++中垃圾回收是需要程序員顯示地進(jìn)行收集,在java語言中是由JVM進(jìn)行負(fù)責(zé)垃圾收集的,以下介紹幾種垃圾收集算法的思想。
- 標(biāo)記-清除算法
標(biāo)記-清除是最基礎(chǔ)的算法,就如其名字一樣,分為“標(biāo)記”、“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象。其主要的缺點(diǎn)有兩個(gè),一個(gè)是效率問題,標(biāo)記和清除兩個(gè)過程的效率都不高,另一個(gè)是空間問題,在標(biāo)記清除完成后,會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片過多時(shí)會(huì)導(dǎo)致程序在以后的運(yùn)行過程中需要分配大對(duì)象時(shí),無法找到足夠的連續(xù)內(nèi)存而不得不觸發(fā)另一次垃圾收集動(dòng)作。 - 復(fù)制算法
為了解決效率問題,可以使用復(fù)制算法,復(fù)制算法將可用內(nèi)存按容量分為大小相等的兩部分,每次只使用其中的一塊,在垃圾收集時(shí),將已使用的內(nèi)存中的還存活的對(duì)象復(fù)制到另一個(gè)內(nèi)存中,然后把已使用過的內(nèi)存進(jìn)行內(nèi)存回收,內(nèi)存分配時(shí)就不會(huì)產(chǎn)生內(nèi)存碎片的問題。但是此算法將內(nèi)存減少一半,付出的代價(jià)相對(duì)較高。現(xiàn)代商業(yè)虛擬機(jī)中將內(nèi)存分為一塊較小的Eden空間和兩塊較小Survivor空間,Hotspot虛擬機(jī)中默認(rèn)Eden和Survivor的大小比例是8:1,也就是每次新生代中可用內(nèi)存為整個(gè)新生代容量的90%(80%+10%),只有10%會(huì)被浪費(fèi)。 - 標(biāo)記-整理算法
標(biāo)記整理算法和標(biāo)記清除類似,其過程為標(biāo)記、整理、清除三個(gè)標(biāo)段。在可回收對(duì)象被標(biāo)記后會(huì)將還存活的對(duì)象移動(dòng)到另外一端,然后清理掉先前一端的內(nèi)存。 - 分代收集算法
分代收集算法根據(jù)對(duì)象的存活周期的不同將內(nèi)存劃分為幾塊,一般分為新生代和老年代。這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用何時(shí)的收集算法。在新生代中,,每次垃圾收集時(shí)都有大批對(duì)象死去,只有少量存活,那就選用復(fù)制算法。而老年代中因?yàn)閷?duì)象存活率高、沒有額外空間對(duì)它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記-清除”或者“標(biāo)記-整理”算法來進(jìn)行回收。
總結(jié)
以上是生活随笔為你收集整理的JVM之垃圾收集算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32寻迹智能车
- 下一篇: R语言图解“等额本金与等额本息”