更新時(shí)間:2020-09-30 15:27:39 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1812次
算法(Algorithm)是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制。而JVM(Java Virtual Machine)則是Java虛擬機(jī),是一種用于計(jì)算設(shè)備的規(guī)范。JVM垃圾收集算法是JVM和算法的完美結(jié)合,本文,讓我們一起來探究這些神奇的JVM垃圾收集算法。
1.標(biāo)記-清除算法
標(biāo)記-清除算法分為兩個(gè)階段:
· 標(biāo)記階段:標(biāo)記可以被回收的對(duì)象;
· 清除階段:回收被標(biāo)記的對(duì)象內(nèi)存;
標(biāo)記-清除算法時(shí)最基礎(chǔ)的算法,因?yàn)楹竺嫣岬降睦厥账惴ǘ际腔诖怂惴ǖ幕A(chǔ)上面改造的,標(biāo)記-清除算法的執(zhí)行過程如下:

標(biāo)記-清除算法主要有兩個(gè)缺點(diǎn):一是標(biāo)記和清除的效率都不高;二是如上圖所示,在標(biāo)記清除可回收的對(duì)象空間后,會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,碎片太多可能會(huì)導(dǎo)致后續(xù)沒有足夠的內(nèi)存分配給較大的對(duì)象,從而導(dǎo)致觸發(fā)新一輪的垃圾收集動(dòng)作。
2.復(fù)制算法
為了解決標(biāo)記-清除算法帶來的內(nèi)存碎片的問題,于是提出了復(fù)制算法。復(fù)制算法把內(nèi)存空間劃分為大小相等的兩塊,每次只使用其中的一塊,然后再把另一塊內(nèi)存空間清理掉:

復(fù)制算法存在著復(fù)制效率低的不足,并且如果不想浪費(fèi) 50% 空間內(nèi)存,則需要提供額外的空間擔(dān)保,以應(yīng)對(duì)被使用的內(nèi)存中所有的對(duì)象都 100% 存活的極端情況。
3.標(biāo)記-整理算法
復(fù)制算法一般不使用在老年代,因?yàn)樵诶夏甏?,大部分的?duì)象的存活率比較高,選擇復(fù)制算法就會(huì)導(dǎo)致過多的復(fù)制操作,導(dǎo)致效率變低。同時(shí)也不采用標(biāo)記-清除算法,因?yàn)闀?huì)產(chǎn)生過多的內(nèi)存碎片,導(dǎo)致容易觸發(fā)新的一輪垃圾回收動(dòng)作。于是出現(xiàn)了一種標(biāo)記-整理算法(標(biāo)記-壓縮算法)。標(biāo)記-整理算法與標(biāo)記-清除算法不同的是,在標(biāo)記完內(nèi)存中的對(duì)象以后,把存活下來的對(duì)象壓縮到內(nèi)存的一端,使得他們緊湊地排序在一起,然后對(duì)存活對(duì)象邊界外的對(duì)象進(jìn)行回收。

4.分代收集算法
分代收集算法會(huì)結(jié)合不同的多種垃圾算法來處理不同的空間,因此在學(xué)習(xí)分代收集算法之前首先需要了解 Java 堆的空間劃分。Java 堆被劃分為新生代(Young Generation)和老年代(Tenured Generation),而新生代又被細(xì)分為 Eden 空間、From Survivor 空間和 To Survivor 空間。因?yàn)樵?Java 堆里面,大部分對(duì)象都是"朝生夕滅",只有少數(shù)的對(duì)象的生命周期比較長,甚至有的對(duì)象的生命周期和虛擬機(jī)的生命周期一樣長,對(duì)不同對(duì)象地生命周期采用不同的垃圾收集算法,這就是分代收集的概念。
以上就是對(duì)JVM垃圾收集算法的完整介紹,想必也足以讓大家領(lǐng)略到JVM垃圾收集算法的魅力所在,當(dāng)然,這只是JVM垃圾收集算法的一個(gè)很小的體現(xiàn)方式,在本站的Java數(shù)據(jù)結(jié)構(gòu)與算法實(shí)戰(zhàn)教程中還有更多神奇的算法等你來一探究竟!
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)