前言
目前JVM中有三種常見(jiàn)的垃圾回收算法,分別是:標(biāo)記清除、標(biāo)記整理和復(fù)制,這三種垃圾回收算法各有優(yōu)缺點(diǎn),下面逐一介紹。
在讀本篇文章中,如果對(duì)JVM中哪個(gè)是垃圾,哪個(gè)不是垃圾,JVM到底是怎么知道的,請(qǐng)先讀下面這篇文章
【JVM】JVM 判斷對(duì)象存活算法(引用計(jì)數(shù)算法與根可達(dá)性分析算法)
標(biāo)記清除(Mark-Sweep)
介紹
標(biāo)記清除算法主要分成兩個(gè)階段,就跟算法的名字一樣,標(biāo)記和清除,標(biāo)記階段是發(fā)現(xiàn)哪些對(duì)象是個(gè)垃圾后,打上標(biāo)記,等到都標(biāo)記完成后,就是清除階段,清除階段就是把該對(duì)象清掉。
下面是一個(gè)示例圖,上面的圖代表清理前的時(shí)候,內(nèi)存中的對(duì)象分布情況,下面的圖代表經(jīng)過(guò)標(biāo)記清除算法后,內(nèi)存中的對(duì)象分布情況:
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):效率高。
缺點(diǎn):可用內(nèi)存太分散,稱之為內(nèi)存碎片化,如果這時(shí)候來(lái)一個(gè)大的對(duì)象,需要占到連續(xù)的內(nèi)存區(qū)域,就會(huì)出現(xiàn)找不到可用的連續(xù)內(nèi)存區(qū)域的情況。
復(fù)制(拷貝 Copying)
介紹
復(fù)制算法的思路是將內(nèi)存區(qū)域一分為二,分別為A區(qū)域和B區(qū)域(注:這里的A區(qū)域和B區(qū)域只是方便理解
),新產(chǎn)生的對(duì)象會(huì)丟在A區(qū)域內(nèi),當(dāng)A區(qū)域滿了以后,就會(huì)把A區(qū)域內(nèi)的存活對(duì)象都移到B區(qū)域內(nèi),并在B區(qū)域內(nèi)把存活對(duì)象排列好,然后A區(qū)域整體清理回收;那么如果B區(qū)域滿了以后呢,就會(huì)把B區(qū)域內(nèi)的存活對(duì)象移到A區(qū)域內(nèi),在A區(qū)域內(nèi)把存活對(duì)象排列好,然后把B區(qū)域整體清理回收,循環(huán)往復(fù),下面是示例圖:
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):效率高,并且把內(nèi)存空間整理了。
缺點(diǎn):浪費(fèi)內(nèi)存,只能用內(nèi)存的一半。
標(biāo)記整理(Mark-Compact)
介紹
標(biāo)記整理算法與標(biāo)記清除算法很像,標(biāo)記整理算法可分為三個(gè)階段,前面兩個(gè)階段與標(biāo)記清除算法本身一樣,標(biāo)記階段是發(fā)現(xiàn)哪些對(duì)象是個(gè)垃圾后,打上標(biāo)記,等到都標(biāo)記完成后,就是清除階段,清除階段就是把該對(duì)象清掉,剩下就到了整理階段,整理階段是將剩余的存活對(duì)象重新在內(nèi)存區(qū)域內(nèi)排列,這樣做就會(huì)避免內(nèi)存碎片化,下面是示例圖。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-490558.html
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):清除垃圾對(duì)象后把內(nèi)存排列好了。
缺點(diǎn):效率低,是這三種算法中效率最低的,。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-490558.html
到了這里,關(guān)于【JVM】JVM 垃圾回收算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!