JVM:(GC)垃圾收集算法 學(xué)習(xí)筆記

一.垃圾收集算法 類型

1.標(biāo)記-清除 算法

2.復(fù)制 算法

3.標(biāo)記-整理? 算法

4.分代收集 算法

二.標(biāo)記-清除 算法

這是垃圾收集算法中 最最基礎(chǔ)的算法

2.1 算法思想

算法分為兩個(gè)階段

1.標(biāo)記階段:標(biāo)記出所有需要回收的對(duì)象

2.清除階段:統(tǒng)一清除(回收)所有被標(biāo)記的對(duì)象

下面主要介紹標(biāo)記階段。標(biāo)記階段主要分為:(先進(jìn)行可達(dá)性分析)

1.第一次標(biāo)記&篩選

2.第二次標(biāo)記&篩選

a.可達(dá)性分析

b.第一次標(biāo)記&篩選

i.方法描述

對(duì)象在可達(dá)性分析中被判斷為不可達(dá)后,會(huì)被第一次標(biāo)記&篩選

a.不篩選=繼續(xù)留在"即將回收"的集合里,準(zhǔn)備回收

b.篩選=從"即將回收"的集合取出

ii.篩選的標(biāo)準(zhǔn)

該對(duì)象是否有必要執(zhí)行finalize()方法

1.若有必要執(zhí)行(認(rèn)為設(shè)置),則篩選出來,進(jìn)入下一階段;第二次標(biāo)記&篩選;

2.若沒必要執(zhí)行,判斷該對(duì)象死亡,不篩選,并等待回收

注:當(dāng)對(duì)象無finalize()方法fianlize()已被虛擬機(jī)調(diào)用過,則視為“沒必要執(zhí)行”

c.第二次標(biāo)記&篩選

當(dāng)對(duì)象經(jīng)過了第一次的標(biāo)記&篩選,會(huì)被進(jìn)行第二次標(biāo)記,并被進(jìn)行篩選

i.方式描述

該對(duì)象會(huì)被放到一個(gè)F-Queue隊(duì)列中,并由虛擬機(jī)自動(dòng)建立,優(yōu)先級(jí)低的Finalizer線程去執(zhí)行對(duì)象中該對(duì)象的finalize()

1.finalize()只會(huì)被執(zhí)行一次

2.但并不承諾等待finalize()運(yùn)行結(jié)束。這是為了防止finalize()執(zhí)行緩慢/停止 使得F-Queue隊(duì)列其他對(duì)象永久等待

ii.判斷標(biāo)準(zhǔn)

在執(zhí)行finalize()過程中,若沒有對(duì)象依然沒有與引用鏈上的GC Roots直接關(guān)聯(lián)或間接關(guān)聯(lián)(即關(guān)聯(lián)上與GC Roots關(guān)聯(lián)的對(duì)象),那么該對(duì)象將被判斷死亡,不篩選(留在“即將回收”集合里)并等待回收

2.2 優(yōu)點(diǎn)

算法簡單、實(shí)現(xiàn)簡單

2.3 缺點(diǎn)

效率問題:即 標(biāo)記和清楚 兩個(gè)過程效率不高

空白問題:標(biāo)記-清除后,會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片


這導(dǎo)致以后程序需要分配較大空間對(duì)象時(shí),無法找到足夠大的連續(xù)內(nèi)存而被迫觸發(fā)另一次垃圾收集行為,這導(dǎo)致非常浪費(fèi)資源

下面繼續(xù)介紹的算法就是為了解決上述兩個(gè)問題

2.4 應(yīng)用場(chǎng)景

對(duì)象存活率較低&垃圾回收行為頻率低的場(chǎng)景

如老年代區(qū)域,因?yàn)槔夏甏鷧^(qū)域回收頻次少、回收數(shù)量少,所以對(duì)于效率問題&空間間隔問題不會(huì)很明顯

3.復(fù)制算法

該算法的出現(xiàn)是為了解決 標(biāo)記-清楚算法中效率&空間問題的

3.1算法思想

將內(nèi)存分為大小相等的兩塊,每次使用其中一塊;

當(dāng)使用的這塊內(nèi)存用完,就將這塊內(nèi)存上還存活的對(duì)象 復(fù)制到另一塊還沒使用過的內(nèi)存上

最終將使用的那塊內(nèi)存一次清理掉

示意圖如下:

3.2 優(yōu)點(diǎn)

1.解決了標(biāo)記-清楚算法中 清除效率低的問題

每次僅回收內(nèi)存一半的區(qū)域

2.解決了標(biāo)記-清楚算法中 空間產(chǎn)生不連續(xù)內(nèi)存碎片的問題

將已使用的存活對(duì)象 移動(dòng)到棧頂?shù)闹羔?,按順序分配?nèi)存即可。

3.3 缺點(diǎn)

1.每次使用內(nèi)存縮小為原來的一半

2.當(dāng)對(duì)象存活率較高的情況下需要做很多復(fù)制操作,即效率會(huì)變低

3.4應(yīng)用場(chǎng)景

對(duì)象存活率較低&需要頻繁進(jìn)行垃圾回收的區(qū)域

如新生代區(qū)域

3.5特別注意

a.背景

新生代區(qū)域在進(jìn)行垃圾回收時(shí),98%對(duì)象都必須得回收

b.問題

復(fù)制算法中? 每次使用的內(nèi)存縮小為原來的一半 利用率低&代價(jià)太高

c.解決方案

不按1:1的比例劃分內(nèi)存,而是按8:1比例將內(nèi)存劃分為一塊較大的Eden和兩塊較小的Survivor區(qū)域(From Survivor、To Survi)


示意圖

每次使用Eden、From Survivor區(qū)域

用完后就將上述兩塊區(qū)域存活的對(duì)象復(fù)制到To Survivor區(qū)域上

最終一次清理掉Eden、From Survivor區(qū)域

使用邏輯 同改進(jìn)前

太多了后面。

。

。

。

。。

看不明白了 ,以后再整理吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容