日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解JVM - ZGC垃圾收集器

發布時間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解JVM - ZGC垃圾收集器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果下面的一些概念有些不清楚的可以先看深入理解JVM - 垃圾收集器和深入理解JVM - Shenandoah垃圾收集器。

ZGC(Z Garbage Collector)是一款由Oracle公司研發的,以低延遲為首要目標的一款垃圾收集器。它是基于動態Region內存布局,(暫時)不設年齡分代,使用了讀屏障、染色指針內存多重映射等技術來實現可并發的標記-整理算法的收集器。在JDK 11新加入,還在實驗階段,主要特點是:回收TB級內存(最大4T),停頓時間不超過10ms。

動態Region

ZGC的Region可以具有如圖所示的大、中、小三類容量:

  • 小型Region(Small Region):容量固定為2MB,用于放置小于256KB的小對象。
  • 中型Region(Medium Region):容量固定為32MB,用于放置大于等于256KB但小于4MB的對象。·
  • 大型Region(Large Region):容量不固定,可以動態變化,但必須為2MB的整數倍,用于放置4MB或以上的大對象。每個大型Region中只會存放一個大對象,最小容量可低至4MB,所有大型Region可能小于中型Region。大型Region在ZGC的實現中是不會被重分配的,因為復制一個大對象的代價非常高昂。

染色指針技術

HotSpot虛擬機的標記實現方案有如下幾種:

  • 把標記直接記錄在對象頭上(如Serial收集器);
  • 把標記記錄在與對象相互獨立的數據結構上(如G1、Shenandoah使用了一種相當于堆內存的1/64大小的,稱為BitMap的結構來記錄標記信息);
  • 直接把標記信息記在引用對象的指針上(如ZGC)
  • 染色指針是一種直接將少量額外的信息存儲在指針上的技術。目前在Linux下64位的操作系統中高18位是不能用來尋址的,但是剩余的46為卻可以支持64T的空間,到目前為止我們幾乎還用不到這么多內存。于是ZGC將46位中的高4位取出,用來存儲4個標志位,剩余的42位可以支持4T的內存,如圖所示:

    • Linux下64位指針的高18位不能用來尋址,所有不能使用;
    • Finalizable:表示是否只能通過finalize()方法才能被訪問到,其他途徑不行;
    • Remapped:表示是否進入了重分配集(即被移動過);
    • Marked1、Marked0:表示對象的三色標記狀態;
    • 最后42用來存對象地址,最大支持4T;

    三色標記

    在并發的可達性分析算法中我們使用三色標記(Tri-color Marking)來標記對象是否被收集器訪問過:

    • 白色:表示對象尚未被垃圾收集器訪問過。顯然在可達性分析剛剛開始的階段,所有的對象都是白色的,若在分析結束的階段,仍然是白色的對象,即代表不可達。
    • 黑色:表示對象已經被垃圾收集器訪問過,且這個對象的所有引用都已經掃描過。黑色的對象代表已經掃描過,它是安全存活的,如果有其他對象引用指向了黑色對象,無須重新掃描一遍。黑色對象不可能直接(不經過灰色對象)指向某個白色對象。
    • 灰色:表示對象已經被垃圾收集器訪問過,但這個對象上至少存在一個引用還沒有被掃描過。

    可達性分析的掃描過程,其實就是一股以灰色為波峰的波紋從黑向白推進的過程,但是在并發的推進過程中會產生“對象消失”的問題,如圖:、

    對象消失理論,只有同時滿足才會發生對象消失:

    • 賦值器插入了一條或多條從黑色對象到白色對象的新引用;
    • 賦值器刪除了全部從灰色對象到該白色對象的直接或間接引用;

    要解決對象消失問題只需要破壞其中一條就行了,目前常用有兩種方案:

    • 增量更新(Incremental Update):增量更新要破壞的是第一個條件,當黑色對象插入新的指向白色對象的引用關系時,就將這個新插入的引用記錄下來,等并發掃描結束之后,再將這些記錄過的引用關系中的黑色對象為根,重新掃描一次。這可以簡化理解為,黑色對象一旦新插入了指向白色對象的引用之后,它就變回灰色對象了。
    • 原始快照(Snapshot At TheBeginning,SATB):原始快照要破壞的是第二個條件,當灰色對象要刪除指向白色對象的引用關系時,就將這個要刪除的引用記錄下來,在并發掃描結束之后,再將這些記錄過的引用關系中的灰色對象為根,重新掃描一次。這也可以簡化理解為,無論引用關系刪除與否,都會按照剛剛開始掃描那一刻的對象圖快照來進行搜索。

    以上無論是對引用關系記錄的插入還是刪除,虛擬機的記錄操作都是通過寫屏障實現的。CMS是基于增量更新來做并發標記的,G1、Shenandoah則是用原始快照來實現。

    染色指針的三大優勢

  • 一旦某個Region的存活對象被移走之后,這個Region立即就能夠被釋放和重用掉,而不必等待整個堆中所有指向該Region的引用都被修正后才能清理,這使得理論上只要還有一個空閑Region,ZGC就能完成收集。而Shenandoah需要等到更新階段結束才能釋放回收集中的Region,如果Region里面對象都存活的時候,需要1:1的空間才能完成收集。
  • 染色指針可以大幅減少在垃圾收集過程中內存屏障的使用數量,ZGC只使用了讀屏障。
  • 染色指針具備強大的擴展性,它可以作為一種可擴展的存儲結構用來記錄更多與對象標記、重定位過程相關的數據,以便日后進一步提高性能。
  • 內存多重映射

    ZGC使用了內存多重映射(Multi-Mapping)將多個不同的虛擬內存地址映射到同一個物理內存地址上,這是一種多對一映射,意味著ZGC在虛擬內存中看到的地址空間要比實際的堆內存容量來得更大。把染色指針中的標志位看作是地址的分段符,那只要將這些不同的地址段都映射到同一個物理內存空間,經過多重映射轉換后,就可以使用染色指針正常進行尋址了,效果如圖:

    ZGC的多重映射只是它采用染色指針技術的伴生產物

    讀屏障

    當對象從堆中加載的時候,就會使用到讀屏障(Load Barrier)。這里使用讀屏障的主要作用就是檢查指針上的三色標記位,根據標記位判斷出對象是否被移動過,如果沒有可以直接訪問,如果移動過就需要進行“自愈”(對象訪問會變慢,但也只會有一次變慢),當“自愈”完成后,后續訪問就不會變慢了。

    讀寫屏障可以理解成對象訪問的“AOP”操作

    ZGC運作過程

    ZGC的運作過程大致可劃分為以下四個大的階段:

    • 并發標記(Concurrent Mark):與G1、Shenandoah一樣,并發標記是遍歷對象圖做可達性分析的階段,它的初始標記和最終標記也會出現短暫的停頓,整個標記階段只會更新染色指針中的Marked 0、Marked 1標志位。
    • 并發預備重分配(Concurrent Prepare for Relocate):這個階段需要根據特定的查詢條件統計得出本次收集過程要清理哪些Region,將這些Region組成重分配集(Relocation Set)。ZGC每次回收都會掃描所有的Region,用范圍更大的掃描成本換取省去G1中記憶集的維護成本。
    • 并發重分配(Concurrent Relocate):重分配是ZGC執行過程中的核心階段,這個過程要把重分配集中的存活對象復制到新的Region上,并為重分配集中的每個Region維護一個轉發表(Forward Table),記錄從舊對象到新對象的轉向關系。ZGC收集器能僅從引用上就明確得知一個對象是否處于重分配集之中,如果用戶線程此時并發訪問了位于重分配集中的對象,這次訪問將會被預置的內存屏障所截獲,然后立即根據Region上的轉發表記錄將訪問轉發到新復制的對象上,并同時修正更新該引用的值,使其直接指向新對象,ZGC將這種行為稱為指針的“自愈”(Self-Healing)能力。

    ZGC的染色指針因為“自愈”(Self-Healing)能力,所以只有第一次訪問舊對象會變慢,而Shenandoah的Brooks轉發指針是每次都會變慢。
    一旦重分配集中某個Region的存活對象都復制完畢后,這個Region就可以立即釋放用于新對象的分配,但是轉發表還得留著不能釋放掉,因為可能還有訪問在使用這個轉發表。

    • 并發重映射(Concurrent Remap):重映射所做的就是修正整個堆中指向重分配集中舊對象的所有引用,但是ZGC中對象引用存在“自愈”功能,所以這個重映射操作并不是很迫切。ZGC很巧妙地把并發重映射階段要做的工作,合并到了下一次垃圾收集循環中的并發標記階段里去完成,反正它們都是要遍歷所有對象的,這樣合并就節省了一次遍歷對象圖的開銷。

    ZGC存在的問題

    ZGC最大的問題是浮動垃圾。

    浮動垃圾

    ZGC的停頓時間是在10ms以下,但是ZGC的執行時間還是遠遠大于這個時間的。假如ZGC全過程需要執行10分鐘,在這個期間由于對象分配速率很高,將創建大量的新對象,這些對象很難進入當次GC,所以只能在下次GC的時候進行回收,這些只能等到下次GC才能回收的對象就是浮動垃圾。

    ZGC沒有分代概念,每次都需要進行全堆掃描,導致一些“朝生夕死”的對象沒能及時的被回收。

    解決方案

    目前唯一的辦法是增大堆的容量,使得程序得到更多的喘息時間,但是這個也是一個治標不治本的方案。如果需要從根本上解決這個問題,還是需要引入分代收集,讓新生對象都在一個專門的區域中創建,然后專門針對這個區域進行更頻繁、更快的收集。

    官方測試數據

    停頓時間

    在ZGC的停頓時間測試上,和其他收集器相比完全不在一個數量級,如圖:

    吞吐量

    ZGC的“弱項”吞吐量方面,以低延遲為首要目標的ZGC已經達到了以高吞吐量為目標Parallel Scavenge的99%,直接超越了G1,如圖:

    優缺點

    • 優點:低停頓,高吞吐量,ZGC收集過程中額外耗費的內存小
    • 缺點:浮動垃圾

    參考

    《深入理解JAVA虛擬機》

    總結

    以上是生活随笔為你收集整理的深入理解JVM - ZGC垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品国产一区二区三区在线观看 | 清纯唯美第一页 | 三级网站免费看 | 色婷婷久久综合中文久久蜜桃av | 美女131爽爽爽做爰视频 | 日韩免费av一区 | 2019毛片| 在线观看亚洲一区二区 | 成人毛片在线精品国产 | 欧美色图亚洲色 | 国产99re | 大陆农村乡下av | 波多野结衣 一区 | 亚洲国产精品久久久久久6q | a级国产毛片 | 在线亚洲不卡 | 免费在线看视频 | 阿v天堂2018 俄罗斯丰满熟妇hd av色吧 | 国内免费av | 日本不卡二区 | 一区二区三区国产在线观看 | 亚州av免费 | 久久网伊人| 日本在线观看www | 免费看污黄网站在线观看 | 国产精品一区免费观看 | 日韩伦理一区 | 自拍毛片 | 欧美一区二区三区爱爱 | 欧美日韩在线视频一区 | 国产99在线观看 | 亚洲日本在线观看视频 | 夜色福利| 亚洲天堂2021av | 国产亚洲女人久久久久毛片 | 一个人看的www片免费高清中文 | 91激情网 | 伊人手机在线视频 | 激情综合网五月婷婷 | av每日更新 | 夜夜骑天天干 | 亚洲性大片 | 三级视频网站在线观看 | 国产又粗又猛又爽又黄av | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 日本xxxxxxxxx18 | 中文字幕亚洲激情 | 特黄特色特刺激免费播放 | 国产6区| 在线观看亚洲成人 | 奇米影视首页 | 337p粉嫩大胆噜噜噜亚瑟影院 | 亚洲区一区二区三区 | 一级淫片在线观看 | 九九热这里有精品 | 四虎永久免费地址 | 精品无码国产av一区二区三区 | heyzo亚洲 | 中文字幕无人区二 | 精品日韩在线视频 | 你懂的亚洲 | 欧美一区二区三区影视 | av视觉盛宴 | 成人黄色一级片 | 日爽夜爽 | 看毛片视频 | 中文字幕在线观看日韩 | 在线观看 亚洲 | 成人刺激视频 | 91资源在线视频 | 黑人操白妞 | 懂色av一区二区夜夜嗨 | 日韩精品www| 91国产免费视频 | 国产女人视频 | 久久伊人在 | 国产一区网站 | 2019日韩中文字幕 | 亚洲免费av一区二区 | 日本三级日本三级日本三级极 | 国产一区二区三区在线观看免费 | 999xxxx| 久久亚洲av永久无码精品 | 午夜av中文字幕 | 捆绑最紧bdsm视频 | 日本少妇激三级做爰在线 | 国产精品欧美综合亚洲 | 91成年人网站 | 天天操天天操天天操天天 | www.17c.com喷水少妇 | 青青草十七色 | a级免费视频 | 亚洲伦理在线观看 | 狠狠躁日日躁夜夜躁2022麻豆 | 亚洲人女屁股眼交6 | av免费观看大全 | 黑人巨大精品欧美一区二区蜜桃 | 女女同性女同一区二区三区九色 | 国产欧美色图 |