jvm垃圾收集器你學廢了嗎(四)

前言

前面三篇文章講了8種垃圾收集器分別是Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1、Shenandoah,今天我們來說一下ZGC收集器,ZGC也是一款低延遲收集器,這款收集器也是非常的豪橫,下面我們看一下它有什麼可豪橫的!
在這裏插入圖片描述

爲何豪橫
  • 支持最大4T的堆大小
    4T 4T 啊 鐵子豪橫嗎
  • 停頓時間不會超過10ms
    而且停頓時間不會隨着堆的增大而增大
  • ZGC 沒有分代的說法,所以沒有跨代引用的問題
  • 單憑上面3點就已經很哇塞了,ZGC還增加了染色指針
    染色指針是一種直接將少量信息存儲在指針上的技術
    在64位的Linux操作系統下,高18位不能用來尋址,所以剩下46位,然後高四位用戶存儲4位標誌信息,通過這些標誌信息,可以看出對象的三色標記狀態,是否進入重分配集,是否通過finalize()方法才能被訪問到。所以說剩下42位的地址空間,也就是說ZGC最多可以管理2的42次方的空間,4TB

染色指針的優勢

  • 染色指針可以使得Region的存活對象被移走之後,這個Region立即就能夠被釋放和重用掉(這裏用到了染色指針的自愈)
    相比Shenandoah收集器來說,Shenandoah在回收Region區域的時候,如果極端情況所有對象都存活,那麼需要一半的Region空間來複制,因爲Shenandoah局部使用的標記-複製算法
  • 染色指針不需要用卡表或者連接矩陣來記錄對象的引用變化,它是直接將這些信息維護在指針中,這樣就不需要用寫屏障了,大幅度上提升了程序的運行效率
  • 染色指針是一種可擴展的存儲結構,例如在64位的Linux系統下,它的高18位是沒有被使用的,所以說它是可擴展的

ZGC的運作過程
  • 併發標記
    和之前說到的G1、Shenandoah收集器一樣
  • 併發預備重分配
    這個階段是遍歷所有的Region區域,標記所有存活的對象,和G1相比,ZGC沒有來維護Region收益記錄,所以要整堆遍歷,這個過程是和用戶線程併發的
  • 併發重分配
    將存活的對象複製到新的Region區,並維護一張轉發表,記錄舊對象和新對象的轉向關係。如果期間有用戶線程訪問了舊對象,這時候ZGC會從引用上得知該對象是佛被重分配過,然後被內存屏障截獲,並修改該對象的引用,ZGC將這種行爲稱爲指針的 自愈
  • 併發重映射
    修改整個堆中的舊對象引用,因爲有了指針的自愈功能,這個階段顯得不再迫切,所以這個階段可下次遍歷對象圖一塊執行

優點

除了上面所有的優點之外,還有以下特點

  • 使用的標記-整理算法,沒有內存碎片
  • ZGC基本上是真正意義上的併發收集

缺點

ZGC無法應對很高的對象分配速率,因爲併發的時候,新對象大都被標記爲存活對象,而大多數對象都是朝生夕滅的,就會有大量的浮動垃圾。

總結

隨着技術的日益發展,垃圾收集也越來越豪橫,我們可根據自己的項目需求來選擇收集器,來提高程序的性能。
這麼一款豪橫的收集器,你學廢了嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章