JVM之垃圾收集器

2022-09-14 09:33:11 字數 2875 閱讀 5309

垃圾**演算法:

標記-清除:先標記後統一清除

缺點:1.執行效率不穩定(表現在假設j**a堆中存在大量需要被**物件,此時標記-清除操作執行效率隨著物件的數量增加而降低)2.產生大量碎片化空間,導致記憶體不連續,無法為大物件分配空間。

標記-複製:將記憶體分為兩塊,每次只使用一塊,當這塊記憶體用完了,就將還存活著的物件複製到另一塊保留區域上,然後再把已使用過的記憶體空間一次性清理掉。

缺點:空間浪費

標記-整理:和「標記-清除」前期標記動作一樣,不同的是標記-整理不是直接對可**物件進行清除,而是將所有存活物件都往記憶體一端移動,然後清理掉邊界以外的記憶體。

缺點:記憶體**變複雜

垃圾**器:

序列收集器:

serial:單執行緒,收集時需暫停所有的應用執行緒,直到收集完成。優點:簡單高效,無線程切換開支。缺點:stw停頓預期不穩定。

serial old:是serial收集器的老年代版,在客戶端模式下hotspot虛擬機器使用。在服務端模式下:1.可搭配parallel sc**enge 使用。2.可作為cms收集器的備選方案使用

並行收集器:

parnew:實質上是serial的多執行緒版本,除此之外,並無太多創新之處。

parallel sc**enge:是乙個多執行緒的新生代收集器,與其他收集器關注點不一樣,它的目標是達到乙個到預期的吞吐量(吞吐量:執行使用者**時間與執行**時間+垃圾收集時間的比值),也稱為「吞吐量優先垃圾收集器」,同時parallel sc**enge提供引數可動態控制吞吐量或stw時間,可自行配置若不熟練可直接使用預設配置。

parallel old:是parallel sc**enge 的老年代版,支援多執行緒,基於「標記-整理」演算法實現。ps+po實現「吞吐量優先」收集器的搭配組合。

cms:以一種獲取「最短停頓時間」為目標的收集器,也稱為「併發低停頓收集器」。致力於縮短停頓時間,給使用者帶來良好體驗。主要基於「標記-清除」演算法實現,收集過程分為四個步驟:

1.初始標記(cms initial mark):標記一下「gc roots」能直接關聯到的物件。

2.併發標記(cms concurrent mark):開始從「gc roots」的直接關聯物件,遍歷整個物件圖的過程,耗時很長,但不需要停掉使用者執行緒,可以與垃圾**器併發執行。

3.重新標記(cms remark):目的是為了糾正因與使用者程式一起運作而產生標記變動那一部分物件的記錄,停頓時間比「初始標記」長,比「併發標記」短。

4.併發清除(cms concurrent sweep):清除刪除掉標記階段標記的已「死掉」的物件,由於不需要移動存活物件,因此此操作也是可與使用者執行緒併發進行。

缺點:1.對cpu資源非常敏感。

2.無法處理「浮動垃圾」,可能導致full gc產生。

3.由於使用「標記-清除」演算法實現垃圾**演算法,會產生大量碎片化記憶體空間。

garbage first(g1):堆仍然有新生代(eden、survivor)、老年代的劃分,但是不再要求它們是記憶體連續的,還有一類特殊的humongous區用來存放大物件(大物件定義:g1認為超過region容量一半的物件)。每個區都由多個region組成,g1之前的垃圾**器的目標範圍主要是要麼整個新生代、要麼整個老年代,要麼是整個j**a堆。而g1可以面向對記憶體任何部分組合成垃圾**集,設計為將堆記憶體「化整為零」的設計思路,衡量標準不再是屬於哪個分代,而是**存放垃圾最多,收益最大基於region記憶體布局的g1,是一款面向「服務端」應用的垃圾**器,被oracle官方譽為「全功能垃圾**器」。jdk7替換掉了jdk5中的cms,jdk9種替換掉了ps+po組合。

g1收集器運作過程:

1.初始標記(initial marking):標記一下「gc roots」能直接關聯到的物件,修改tams指標。

2.併發標記(concurrent marking):開始從「gc roots」的直接關聯物件,對堆中物件進行可達性分析,遞迴掃瞄整個堆中的物件圖,找出可**物件,且掃瞄完後重新處理satb記錄下的在併發時,引用變動的物件。

3.最終標記(final remarking):對使用者執行緒做另乙個短暫的暫停,用於處理併發階段 結束後仍遺留下來的最後那少量的 satb 記錄。

4.篩選**(live data counting and evacuation):負責更新 region 的統計資料,對各個region的**價值和成本進行排序,根據使用者所期望的停頓時間來制定**計畫,可以自由選擇任意多個 region 構成**集,然後把決定**的那一部分 region 的 存活物件複製到空的region中,再清理掉整個舊region的全部空間。

shenandoah:shenandoah作為第一款不由oracle(包括一起的sun)公司的虛擬機器團隊所領導開發的hotspot垃圾收集器。只存在於openjdk當中的,最初由redhat公司建立的,在2023年的時候貢獻給了openjdk。與g1有很多類似之處,其中有相同的堆記憶體布局,收集過程設計思路也有許多相似之處。

shenandoah相較於g1的改進之處:

1.支援併發整理演算法。shenandoah可與使用者執行緒併發操作。

2.shenandoah預設不使用分代收集。

3.shenandoah摒棄了在g1中耗費大量記憶體維護的記憶集,改用「連線矩陣」的全域性資料結構來記錄跨region的引用關係,降低了處理跨代指標時的記憶集的維護消耗,同時降低了偽共享問題的發生概率。

JVM垃圾收集器之CMS收集器

cms concurrent mark sweep 收集器是一種以獲取最短 停頓時間為目標的收集器。1 cms使用的演算法 cms使用的演算法為 標記 清除 演算法 2 執行過程4步驟 a 初始標記 cms initial mark b 併發標記 cms concurrent mark c 重新標記...

JVM的垃圾收集器

parnew收集器 parnew相比serial,則是較多的執行在server模式下的虛擬機器中首選的新生代收集器。而且還有乙個重要的原因,除了serial外,目前只有他能與cms收集器 jdk1.5推出,是hotspot第一款真正意義上的併發收集器 搭配工作。parnew可以使用 xx paral...

jvm垃圾收集器介紹

以上是 虛擬機器中的 7 個垃圾收集器,連線表示垃圾收集器可以配合使用。是 serial 收集器的老年代版本,也是給 client 模式下的虛擬機器使用。如果用在 server 模式下,它有兩大用途 是 parallel sc enge 收集器的老年代版本。cms concurrent mark s...