一、標(biāo)記-清除算法
標(biāo)記無用對象,然后進(jìn)行清除回收。
標(biāo)記-清除算法(Mark-Sweep)是一種常見的基礎(chǔ)垃圾收集算法,它將垃圾收集分為兩個(gè)階段:
- 標(biāo)記階段:標(biāo)記出可以回收的對象。
- 清除階段:回收被標(biāo)記的對象所占用的空間。
標(biāo)記-清除算法之所以是基礎(chǔ)的,是因?yàn)楹竺嬷v到的垃圾收集算法都是在此算法的基礎(chǔ)上進(jìn)行改進(jìn)的。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,不需要對象進(jìn)行移動。
缺點(diǎn):標(biāo)記、清除過程效率低,產(chǎn)生大量不連續(xù)的內(nèi)存碎片,提高了垃圾回收的頻率。
標(biāo)記-清除算法的執(zhí)行的過程如下圖所示
二、復(fù)制算法
為了解決標(biāo)記-清除算法的效率不高的問題,產(chǎn)生了復(fù)制算法。它把內(nèi)存空間劃為兩個(gè)相等的區(qū)域,每次只使用其中一個(gè)區(qū)域。垃圾收集時(shí),遍歷當(dāng)前使用的區(qū)域,把存活對象復(fù)制到另外一個(gè)區(qū)域中,最后將當(dāng)前使用的區(qū)域的可回收的對象進(jìn)行回收。
優(yōu)點(diǎn):按順序分配內(nèi)存即可,實(shí)現(xiàn)簡單、運(yùn)行高效,不用考慮內(nèi)存碎片。
缺點(diǎn):可用的內(nèi)存大小縮小為原來的一半,對象存活率高時(shí)會頻繁進(jìn)行復(fù)制。
復(fù)制算法的執(zhí)行過程如下圖所示
三、標(biāo)記-整理算法
在新生代中可以使用復(fù)制算法,但是在老年代就不能選擇復(fù)制算法了,因?yàn)槔夏甏膶ο蟠婊盥蕰^高,這樣會有較多的復(fù)制操作,導(dǎo)致效率變低。標(biāo)記-清除算法可以應(yīng)用在老年代中,但是它效率不高,在內(nèi)存回收后容易產(chǎn)生大量內(nèi)存碎片。
因此就出現(xiàn)了一種標(biāo)記-整理算法(Mark-Compact)算法,與標(biāo)記-清除算法不同的是,在標(biāo)記可回收的對象后將所有存活的對象壓縮到內(nèi)存的一端,使他們緊湊的排列在一起,然后對端邊界以外的內(nèi)存進(jìn)行回收?;厥蘸螅延煤臀从玫膬?nèi)存都各自一邊。
優(yōu)點(diǎn):解決了標(biāo)記-清理算法存在的內(nèi)存碎片問題。
缺點(diǎn):仍需要進(jìn)行局部對象移動,一定程度上降低了效率。
標(biāo)記-整理算法的執(zhí)行過程如下圖所示
四、分代收集算法
分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根據(jù)對象存活的不同生命周期將內(nèi)存劃分為不同的域,一般情況下將 GC 堆劃分為老生代(Tenured/Old Generation)和新生代
(YoungGeneration)。
老生代的特點(diǎn)是每次垃圾回收時(shí)只有少量對象需要被回收,新生代的特點(diǎn)是每次垃圾回收時(shí)都有大量垃圾需要被回收,因此可以根據(jù)不同區(qū)域選擇不同的算法。
當(dāng)前商業(yè)虛擬機(jī)都采用分代收集的垃圾收集算法。分代收集算法,顧名思義是根據(jù)對象的存活周期將內(nèi)存劃分為幾塊。一般包括年輕代、老年代 和 永久代,如圖所示:
當(dāng)前主流 VM 垃圾收集都采用”分代收集” (Generational Collection)算法, 這種算法會根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊, 如 JVM 中的 新生代、老年代、永久代, 這樣就可以根據(jù)各年代特點(diǎn)分別采用最適當(dāng)?shù)?GC 算法
新生代: 復(fù)制算法
老年代:標(biāo)記-整理算法文章來源:http://www.zghlxwxcb.cn/news/detail-835042.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-835042.html
到了這里,關(guān)于說一下 JVM 有哪些垃圾回收算法?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!