7中經典垃圾收集器:https://blog.csdn.net/weixin_43696529/article/details/104884777算法
低延遲收集器安全
8.Shenandoah數據結構
與G1有三個明顯不一樣多線程
支持併發的整理算法併發
不使用分代收集佈局
摒棄了記憶集,改用鏈接矩陣(Region N 有對象指向Region M ,則在表格N行M列中打標記).net
回收過程線程
初始標記:與G1同樣,標記全部與GC Roots直接關聯的對象,還是Stop the World指針
併發標記:與G1同樣,便利對象圖,標記所有可達對象,與用戶線程併發日誌
最終標記:與G1同樣,處理剩餘的SATB掃描,計算回收價值最高的Region
併發清理:清理一個存貨對象都沒有的Region
併發回收:把回收集的存活對象複製進其餘Region中,經過讀屏障被稱爲Brooks Pointers 的轉發指針來解決併發過程當中用戶對對象的讀寫訪問
初始引用更新:並未有實際操做,是爲了確保全部回收線程已經完成了分配給他們的對象遷移任務,,會產很是短暫的停頓
併發引用更新:按照物理內存地址順序,先行搜索引用類型,把舊值改成新值
最終引用更新:修正存在於GC Roots中的引用,最後一次停頓,與GC Roots數量有關
併發清理:回收集中已無尋獲對象,併發清理這些Region對象。
轉發指針:在原有對象佈局的最前面贊成添加一個新的引用字段,正常狀況下,指向本身
問題:
多線程併發寫入,1.複製新副本2.用戶更新對象字段3.更新轉發引用指針爲新地址以上順序會致使問題,經過比較並交換(Compare And Swap ,CAS),保證併發時對象的訪問正確性
每次訪問會帶來一次額外的轉向開銷,高運行負擔使得吞吐量降低(弱項,即運行時間降低)和低延遲時間(強項)
9.ZGC
主要特徵:
基於Region內存佈局
使用讀屏障,染色指針和內存多重映射技術實現併發的標記—整理算法
以低延遲爲首要目標
Region動態性
小型Region:固定爲2MB,放置小於256KB的小對象
中型Region:固定爲32MB,放置大於256KB小於4MB的對象
大型Region:容量不固定,可動態變化,必須爲2MB的整數倍,放置4MB或以上的大對象,每一個大型Region只存放一個大對象,實際容量徹底有可能小於中型Region,最小低至4MB
併發整理算法實現:染色指針技術
對象頭存儲額外的數據,如哈希碼,分代年齡,鎖記錄等。
標記階段三色標記:標記在對象頭(Serial),與對象獨立的數據結構(G1,ShenAndaoh用1/64堆大小的BItMap)
ZGC直接把標記信息記在引用對象的指針上
優點:
某個Region的存活對象被移走以後,Region能當即被釋放和重用掉
減小垃圾收集的內存屏障使用數量(ZGC不支持分代收集)
染色指針能夠做爲一種可擴展的存儲結構記錄更多與對象標記,重定位過程相關的數據
內存多重映射技術
染色指針中的標誌位看做地址分段符,經過Linux系統調用mmap將標記位(001,010,100)三種地址空間映射到同一地址上,使三種地址解析後都指向同一地址
回收過程:
併發標記:與G1,Shenandoah同樣,便利對象圖作可達性分析,會更新染色指針中的Marked0,Marked1標誌位
併發預備重分配:統計要清理的Region組成重分配集,重分配集只決定了裏面的存活對象會被複制到其餘Region中,裏面的Region會被釋放,不能說回收是針對這個集合裏的Region進行,由於標記過程是針對全堆的,JDK12的ZGC中開始支持的類卸載以及弱引用的處理,也是在這個階段中完成的。
併發從新分配:重分配集中的存活對象複製到新的Region上,併爲重分配集中的每一個Region維護一個轉發表(記錄就對象到新對象的轉向關係),若是此時用戶線程訪問重分配集中的對象,訪問被內存屏障截獲,根據Region上的轉發表將訪問轉發到新的對象上,並修正更新該引用(自愈),只要Region複製完畢就能夠釋放從新分配對象,未更新的指針一旦被使用能夠自愈
併發重映射:修正整個堆中指向重分配集中舊對象的全部引用。由於能夠自愈,因此ZGC把它合併到了下一次垃圾回收時的併發標記階段完成(節省了一次遍歷對象圖的開銷)
Epsilon收集器
收集器權衡
應用程序關注點
運行程序的基礎設施
JDK的發行商,版本號
虛擬機及垃圾收集日誌
垃圾收集參數總結
內存分配及回收策略
對象優先在Eden分配
大對象直接進入老年代
長期存貨的對象進入老年代(對象年齡計數器,存放在對象投中)
動態對象年齡斷定
Survivor中相同年齡的對象大小總和大於Survivor的一半,年齡大於或等於設定年齡(-XX:MaxTenuringThreshold)的能夠直接進入老年代
空間分配擔保
大量對象存活,Survivor存不下,把Survivor沒法容納的對象直接送入老年代
檢查老年代最大可用連續空間是否大於新生代全部對象總空間,若是成立,一次Minor GC 可確保時安全的,不成立則查看是否容許擔保失敗(-XX:HandlePromotionFailure),
若容許檢查老年打連續可用空間是否大於歷次晉升到老年代的平均大小,若大於,進行一次Minor GC,若小於,改成進行Full GC。
若是連續可用空間大於歷次晉升老年代平均大小,仍是Minor Gc失敗,則從新進行Full Gc,這樣停頓時間就更長了(由於繞了一圈),但一般開啓-XX:HandlePromotionFailure,避免頻繁Full Gc。