ZGC初步了解

ZGC

ZGC和G1,CMS一樣都是一種垃圾回收器。那其實G1已經很不錯了

為什么還需要ZGC呢

ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延遲垃圾回收器,它的設計目標包括:

  • 停頓時間不超過10ms;

  • 停頓時間不會隨著堆的大小,或者活躍對象的大小而增加;

  • 支持8MB~4TB級別的堆(未來支持16TB)

先看下G1垃圾回收器

這里全紅的即為需要STW的

ZGC的流程

GC 的完整工作流程如下:

  1. 初始標記(Initial Mark)

    1. 目標:標記 GC Roots 直接關聯的對象。

    2. 操作:暫停所有應用線程(STW),快速標記根對象。

    3. 耗時:通常 <1ms。

  2. 并發標記(Concurrent Mark)

    1. 目標:遍歷整個對象圖,標記所有存活對象。

    2. 操作:GC 線程與應用線程并發執行,通過染色指針記錄對象狀態。

    3. 關鍵機制

      • 對象重定位(Relocation):標記過程中發現需要移動的對象,提前記錄遷移信息。

      • 再標記(Remark):處理并發標記期間發生變化的對象引用。

  3. 并發轉移(Concurrent Transfer)

    1. 目標:將存活對象移動到新的內存區域,釋放舊內存。

    2. 操作

      • 預轉移(Pre-Transfer):為對象遷移做準備,更新元數據。

      • 轉移(Transfer):GC 線程與應用線程并發遷移對象,確保業務線程無感知。

    3. 關鍵技術

      • 讀屏障(Load Barriers):在對象訪問時自動修正指針,指向新內存地址。

      • 自愈(Self-Healing):若遷移過程中出現指針失效,可通過染色指針快速恢復。

  4. 最終清理(Final Cleanup)

    1. 目標:回收完全空閑的內存頁,重置 GC 周期。

    2. 操作:短暫 STW,清理元數據和統計信息。

ZGC關鍵技術

通過 并發標記 + 并發轉移 + 實時地址修正,實現零停頓。

ZGC 通過 著色指針(Colored Pointer)讀屏障(Load Barriers) 技術,在對象轉移過程中實現 無鎖并發訪問

著色指針(Colored Pointer)

Colored Pointer,染色指針是一種讓指針存儲額外信息的技術。我們知道在64位操作系統里,一個內存的地址總共64位,但是受限于實際物理內存的大小,我們其實并不是真正的使用所有64位。這里如果小伙伴了解linux的虛擬內存管理會很好理解,我這里大概解釋一下。我們平時所說操作系統的“物理內存地址“并不是真正的”物理內存地址”,也就是說,并不是物理上,內存顆粒對應的地址。而是操作系統為我們虛擬的一個“虛擬地址”,這個技術被稱為虛擬內存管理。虛擬內存基本在所有的linux服務器上都有使用,除了少部分嵌入式設備,因為內存太小不需要使用這種技術。在虛擬內存的幫助下,我們可以做到兩個虛擬內存地址對應一個真實的物理地址。

對于JVM來說,一個對象的地址只使用前42位,而第43-46位用來存儲額外的信息,即GC對象處于ZGC那個階段。只使用46位的客觀原因是linux系統只支持46位的物理地址空間,即64T的內存,如果一定想要使用更大的內存,需要linux額外的設置。但是這個內存設置在主流的服務器上都夠用了。

在引用地址的劃分上,對象引用第43位表示marked0標記,44位marked1標記,45位remapped標記,46位finalizable標記。指針染色就是給對應的位置為1,當然這三個位同一個時間只能有一個位生效。這些標記分別表示對象處于GC的那個階段里。在下面ZGC的詳細過程里我們會介紹染色指針怎么幫助GC的。指針的引用地址在各個標記之間切換也被稱為指針的自愈。

  1. Java Heap 的 4TB 是物理地址范圍

    1. Java Heap 的 4TB 由 0~41 位直接映射的物理地址決定,與 M0/M1 的虛擬地址空間無關。

    2. M0/M1 的虛擬地址空間通過高位元數據擴展,但物理內存仍受限于硬件和操作系統。


5. 實際地址轉換示例

假設物理內存地址為 0xDEADBEEF(42 位足夠表示):

  • 在 M0 中的虛擬地址

高位元數據(0000) | 物理地址(0xDEADBEEF) => 0x0000DEADBEEF...
  • 在 M1 中的虛擬地址

高位元數據(0001) | 物理地址(0xDEADBEEF) => 0x0001DEADBEEF...
  • 切換地址空間

    • 通過原子操作將默認元數據從 0000 改為 0001,所有新訪問自動重定向到 M1。

核心設計

  • 高位存儲元數據: ZGC 將 64 位指針的高 4 位(第 42~45 位)用作元數據標記,而非傳統對象頭存儲存活狀態。

    位范圍用途
    42~45 (4 bits)對象存活狀態(標記、轉移階段等)
    0~41實際物理地址
    • 標記位含義

  • 虛擬地址空間劃分: ZGC 將 64 位地址空間劃分為多個子空間,同一物理內存對應三個虛擬地址:

虛擬地址空間地址范圍作用
M0[4TB, 8TB)存放當前活躍對象的最新地址
M1[8TB, 12TB)存放對象轉移后的新地址
Remapped[16TB, 20TB)用于地址重定向(空間換時間)
ZGC中讀屏障的代碼作用:

在對象標記和轉移過程中,用于確定對象的引用地址是否滿足條件,并作出相應動作。

接下來詳細介紹ZGC一次垃圾回收周期中地址視圖的切換過程:

  • 初始化:ZGC初始化之后,整個內存空間的地址視圖被設置為Remapped。程序正常運行,在內存中分配對象,滿足一定條件后垃圾回收啟動,此時進入標記階段。

  • 并發標記階段:第一次進入標記階段時視圖為M0,如果對象被GC標記線程或者應用線程訪問過,那么就將對象的地址視圖從Remapped調整為M0。所以,在標記階段結束之后,對象的地址要么是M0視圖,要么是Remapped。如果對象的地址是M0視圖,那么說明對象是活躍的;如果對象的地址是Remapped視圖,說明對象是不活躍的。

  • 重新標記(Remark)

這個階段是處理一些并發標記階段未處理完的任務(少量STW,控制在1ms內)如果沒處理完還會再次并發標 記,這里其實主要是解決三色標計算法中的漏標的問題,即白色對象被黑色對象持有的問題。并發標記階段發 生 引用更改的對象會被記錄下來(觸發讀屏障就會記錄),在這個階段標記引用被更改的對象

  • 并發預備重分配(Concurrent Prepare for Relocate)

    ??這一步主要是為了之后的遷移做準備,這一步主要是處理軟引用,弱引用,虛引用對象,以及重置page的Forwarding table, 收集待回收的page信息到Relocation Set

    ??Forwarding table是記錄對象被遷移后的新舊引用的映射表。Relocation Set是存放記錄需要回收的存活頁集合。這個階段ZGC會掃描所有的page,將需要遷移的page信息存儲到Relocation Set,這一點和G1很不一樣,G1是只選擇部分需要回收的Region。在記錄page信息的同時還會初始化page的Forwarding table,記錄下每個page里有哪些需要遷移的對象。這一步耗時很長,因為是全量掃描所有的page,但是因為是和用戶線程并發運行的,所以并不會STW,而且對比G1,還省去了維護RSet和SATB的成本。

    • 初始遷移(Relocate Start)

      ??這個階段是為了找出所有GC Roots直接可達的對象,并且切換good mask到remapped,這一步是STW的。這里注意一個問題,被GC Roots直接引用的對象可能需要遷移。如果需要,則會將該對象復制到新的page里,并且修正GC Roots指向本對象的指針,這個過程就是“指針的自愈”。當然這不是重點重點是切換good mask.

      • 并發轉移階段:標記結束后就進入轉移階段,此時地址視圖再次被設置為Remapped。如果對象被GC轉移線程或者應用線程訪問過,那么就將對象的地址視圖從M0調整為Remapped。

      其實,在標記階段存在兩個地址視圖M0和M1,上面的過程顯示只用了一個地址視圖。之所以設計成兩個,是為了區別前一次標記和當前標記。也即,第二次進入并發標記階段后,地址視圖調整為M1,而非M0。

      著色指針和讀屏障技術不僅應用在并發轉移階段,還應用在并發標記階段:將對象設置為已標記,傳統的垃圾回收器需要進行一次內存訪問,并將對象存活信息放在對象頭中;而在ZGC中,只需要設置指針地址的第42~45位即可,并且因為是寄存器訪問,所以速度比訪問內存更快

      ZGC的優勢很明顯,幾乎全程并發的回收過程帶來了無與倫比的低暫停時間,這也是ZGC的設計思路。低暫停時間加上JAVA本身的支持高并發的特點,假以時日ZGC將來一定是能在服務器領域的展現它大殺器級別的威力。但是為了達到這個設計目標,ZGC其實也犧牲了一些東西,比如吞吐量以及在JDK21之前ZGC不分代

      調優案例(參考美團技術文章)

      案例一:秒殺活動中流量突增,出現性能毛刺

      (1)開啟”基于固定時間間隔“的GC觸發機制:-XX:ZCollectionInterval。比如調整為5秒,甚至更短。

      (2)增大修正系數-XX:ZAllocationSpikeTolerance,更早觸發GC。ZGC采用正態分布模型預測內存分配速率,模型修正系數ZAllocationSpikeTolerance默認值為2,值越大,越早的觸發GC,Zeus中所有集群設置的是5。

      案例二:壓測時,流量逐漸增大到一定程度后,出現性能毛刺

      增大-XX:ConcGCThreads, 加快并發標記和回收速度。ConcGCThreads默認值是核數的1/8,8核機器,默認值是1。該參數影響系統吞吐,如果GC間隔時間大于GC周期,不建議調整該參數。

      案例三: 單次GC停頓時間30ms,與預期停頓10ms左右有較大差距

      升級Aviator組件版本,避免生成多余的ClassLoader。

      案例四:服務啟動后,運行時間越長,單次GC時間越長,重啟后恢復

      通過業務優化解決,刪除不需要執行的Aviator表達式,從而避免了大量Aviator方法進入CodeCache中。

      本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
      如若轉載,請注明出處:http://www.pswp.cn/diannao/76099.shtml
      繁體地址,請注明出處:http://hk.pswp.cn/diannao/76099.shtml
      英文地址,請注明出處:http://en.pswp.cn/diannao/76099.shtml

      如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

      相關文章

      Tof 深度相機原理

      深度相機(TOF)的工作原理_tof相機原理-CSDN博客 深度剖析 ToF 技術&#xff1a;原理、優劣、數據糾錯與工業應用全解析_tof技術-CSDN博客 飛行時間技術TOF_tof計算公式-CSDN博客 深度相機&#xff08;二&#xff09;——飛行時間&#xff08;TOF&#xff09;_飛行時間技術-C…

      c++-函數增強

      一、編譯器對函數名的處理 1. C與C的差異 C編譯器&#xff1a;保留原始函數名&#xff0c;無額外處理。例如&#xff1a; int add(int a, int b) { return a b; } 在匯編代碼中仍為add。 C編譯器&#xff1a;通過name mangling&#xff08;名稱修飾&#xff09;生成唯一函數…

      跟著StatQuest學知識08-RNN與LSTM

      一、RNN &#xff08;一&#xff09;簡介 整個過程權重和偏置共享。 &#xff08;二&#xff09;梯度爆炸問題 在這個例子中w2大于1&#xff0c;會出現梯度爆炸問題。 當我們循環的次數越來越多的時候&#xff0c;這個巨大的數字會進入某些梯度&#xff0c;步長就會大幅增加&…

      HarmonyOS 之 @Require 裝飾器自學指南

      在 HarmonyOS 應用開發工作中&#xff0c;我頻繁碰到組件初始化傳參校驗的難題。在復雜的組件嵌套里&#xff0c;要是無法確保必要參數在構造時準確傳入&#xff0c;就極易引發運行時錯誤&#xff0c;而且排查起來費時費力。一次偶然的機會&#xff0c;我接觸到了 Require 裝飾…

      CDN節點對網絡安全掃描的影響:挑戰與應對策略

      引言 在當今互聯網環境中&#xff0c;內容分發網絡(CDN)已成為提升網站性能和用戶體驗的關鍵技術。然而&#xff0c;CDN的廣泛應用也為網絡安全掃描帶來了新的挑戰。本文將深入探討CDN節點如何影響各類安全掃描工作&#xff0c;分析由此產生的安全風險&#xff0c;并提供有效的…

      【Git多分支使用教程】

      Git多分支使用教程 Git多分支使用手冊目錄多分支只拉取一個多分支拉取指定幾個步驟 1&#xff1a;克隆第一個分支步驟 2&#xff1a;獲取其他分支 常見問題與解決方法1. 錯誤&#xff1a;origin/分支名 is not a commit2. 分支名稱沖突3. --single-branch 限制 總結 Git多分支使…

      【身份安全】OAuth 2.0工作原理(一)

      目錄 OAuth 授權框架一、OAuth 角色二、協議流程三、應用注冊&#xff08;Application Registration&#xff09;用戶 ID&#xff08;Client ID&#xff09; 和 用戶密碼&#xff08;Client Secret&#xff09; 四、權限授予1、授權碼鏈接2、用戶授權申請3、應用程序接收授權碼…

      大疆上云api直播功能如何實現

      概述 流媒體服務器作為直播畫面的中轉站,它接收推流端的相機畫面,同時拉流端找它獲取相機的畫面。整個流程如下: 在流媒體服務器上創建流媒體應用(app),一個流媒體服務器上面可以創建多個流媒體應用約定推拉流的地址。假設流媒體服務器工作在1935端口上面,假設創建的流…

      ESP-01模塊連接手機熱點問題及解決方法

      在使用ESP-01模塊連接手機熱點時&#xff0c;可能會遇到一些問題。本文將詳細介紹如何解決這些問題&#xff0c;并分享最終通過將WiFi切換到2.4GHz成功解決問題的經驗。 一、問題描述 在嘗試使用ESP-01模塊連接手機熱點時&#xff0c;遇到了連接失敗的問題。以下是操作過程中…

      NG-ZORRO中tree組件的getCheckedNodeList怎么使用

      在 NG-ZORRO&#xff08;Ant Design for Angular&#xff09; 的 Tree 組件 中&#xff0c;getCheckedNodeList 方法用于獲取當前選中的節點列表&#xff08;包括半選狀態節點&#xff09;。以下是具體用法和示例&#xff1a; 基本用法 首先&#xff0c;確保你已通過 ViewChil…

      業務流程先導及流程圖回顧

      一、測試流程回顧 &#xfeff; 1. 備測內容回顧 &#xfeff; 備測內容: 本次測試涵蓋買家和賣家的多個業務流程&#xff0c;包括下單流程、發貨流程、搜索退貨退款、支付搶購、換貨流程、個人中心優惠券等。 2. 先測業務強調 &#xfeff; 1&#xff09;測試業務流程 …

      從ChatGPT到AutoGPT——AI Agent的范式遷移

      一、AI Agent的范式遷移 1. ChatGPT的局限性與Agent化需求 單輪對話的“工具屬性” vs. 多輪復雜任務的“自主性” ChatGPT 作為強大的生成式AI,雖然能夠進行連貫對話,但本質上仍然是“工具型”AI,依賴用戶提供明確的指令,而無法自主規劃和執行任務。 人類介入成本過高:提…

      【Kafka】分布式消息隊列的核心奧秘

      文章目錄 一、Kafka 的基石概念?主題&#xff08;Topic&#xff09;?分區&#xff08;Partition&#xff09;?生產者&#xff08;Producer&#xff09;?消費者&#xff08;Consumer&#xff09;? 二、Kafka 的架構探秘?Broker 集群?副本機制? 三、Kafka 的卓越特性?高…

      【藍橋杯14天沖刺課題單】Day 1

      1. 題目鏈接&#xff1a;19937 藝術與籃球 該題目的難點主要在20240413這個日期需要結束程序跳出循環。最開始將該輸出ans的位置放在了for循環之外&#xff0c;此時的日期已經循環完了2024年所有的日期&#xff0c;則最后會統計多而導致結果錯誤。 AC代碼&#xff1a; #incl…

      AI人工智能-Jupyter NotbookPycharm:Py開發

      安裝 命令&#xff1a; pip install jupyter 啟動 命令&#xff1a; jupyter notebook 啟動成功后&#xff0c;下面網址會默認自動打開當前用戶的根目錄。 其實這個頁面顯示的內容&#xff0c;是我們電腦目錄C:\Users\當前用戶\下的文件夾 我們平常做實驗&#xff0c;希望在…

      命懸生死線:當游戲遭遇DDoS圍剿,如何用AI破局?

      文章作者&#xff1a;騰訊宙斯盾DDoS防護團隊 一、血色戰場&#xff1a;DDoS攻擊游戲產業的致命瞬間 全球黑色星期五 這是一場波及全球的“黑色星期五”&#xff0c;起初無人察覺&#xff0c;包括小林。 他剛下班到家就迫不及待打開電腦&#xff0c;準備體驗期待已久的《黑神話…

      使用HTML5和CSS3實現3D旋轉相冊效果

      使用HTML5和CSS3實現3D旋轉相冊效果 這里寫目錄標題 使用HTML5和CSS3實現3D旋轉相冊效果項目介紹技術棧核心功能實現思路1. HTML結構2. CSS樣式解析2.1 基礎樣式設置2.2 3D效果核心樣式2.3 卡片樣式 3. JavaScript交互實現3.1 旋轉控制3.2 自動播放功能 技術要點總結項目亮點總…

      【HTML 基礎教程】HTML <head>

      HTML <head> 查看在線實例 <title> - 定義了HTML文檔的標題 使用 <title> 標簽定義HTML文檔的標題 <base> - 定義了所有鏈接的URL 使用 <base> 定義頁面中所有鏈接默認的鏈接目標地址。 <meta> - 提供了HTML文檔的meta標記 使用 <me…

      macbook電腦如何清理鍵盤防止誤觸

      M1芯片的MacBook電腦關機后按任意鍵開機&#xff0c;是蘋果的功能設計。這樣設計的目的是為了方便用戶&#xff0c;讓用戶在想要使用電腦時能快速開機。但是清理電腦鍵盤的時候卻成為了一種苦惱 以下是一些清理 MacBook 鍵盤防止誤觸的方法&#xff1a; 使用工具鎖定鍵盤 Cle…

      Rust 面向對象

      Rust 面向對象 引言 Rust 是一種系統編程語言,以其高性能、內存安全和并發支持而受到關注。Rust 的面向對象特性是其強大功能之一,它允許開發者以面向對象的方式構建復雜的應用程序。本文將深入探討 Rust 的面向對象編程(OOP)特性,包括類的定義、繼承、封裝和多態等概念…