JVM垃圾回收器-ZGC

一、概述

ZGC(Z Garbage Collector)是一種高效且可擴展的低延遲垃圾回收器。在垃圾回收過程中,ZGC通過優化算法和硬件支持,將Stop-The-World(STW)時間控制在一毫秒以內,使其成為追求低延遲應用的理想選擇。此外,ZGC支持靈活的堆大小配置,從幾百兆到16TB的堆大小均可輕松應對,且堆大小對STW時間的影響微乎其微。

二、G1機制

G1的STW時間具體包括以下幾個步驟:

  • 初始標記(Initial Mark):STW階段,采用三色標記法快速標記從GC Root直接可達的對象。此階段的STW時間通常非常短暫。
  • 并發標記(Concurrent Mark):并發執行階段,對存活對象進行標記。這個階段允許用戶線程和GC線程同時工作,從而減少了STW時間。
  • 最終標記(Final Mark):STW階段,處理SATB(Snapshot-At-The-Beginning)相關的對象標記。此階段的STW時間同樣較短。
  • 清理(Cleanup):STW階段,如果某個區域中沒有存活對象,則直接清理該區域。此階段的STW時間也較短。
  • 轉移(Copy):將存活對象復制到其他區域。STW時間較長的階段,因為它涉及對象的復制和引用更新。

三、G1缺點

G1轉移時需要停頓,STW時間較長。因為如果不STW,會出現數據不一致。

舉例:假設對象A引用了對象C,在轉移過程中,C對象被復制到新的區域。如果此時用戶線程修改了A對象的某個屬性,但實際上這個修改是針對轉移前的C對象。當轉移完成后,A對象的引用被更新為指向新的C對象,但此時獲取屬性仍是原來的舊值,因為修改是在轉移前進行的。這種不一致性會導致數據錯誤。

為了解決這個問題,G1垃圾回收器在轉移過程中需要暫停用戶線程,確保轉移操作的原子性和正確性。然而,ZGC和Shenandoah等新型垃圾回收器解決了這一問題,使得轉移過程也能夠并發執行,從而進一步提高了性能。

四、ZGC核心技術

1.讀屏障(Load Barrier)

在ZGC中,采用了讀屏障(Load Barrier)技術來處理對象引用的獲取。當嘗試獲取一個對象引用時,讀屏障會檢查該引用是否指向了轉移后的對象。如果不是,用戶線程會將引用更新為指向轉移后的對象。這樣就可以直接修改轉移后的對象的屬性。

2.著色指針(Colored Pointers)

著色指針的設計將原本8字節的地址指針巧妙地拆分成了三個部分:

  • 低44位地址:用于直接表示對象的內存地址,這個范圍足夠覆蓋大多數應用程序所使用的內存空間,最多可以表示16TB的內存。
  • 中間4位顏色位:這四位用于存儲關于對象狀態的信息。每一位只能存儲0或1,并且同一時間只有一位可以是1。不同的位代表不同的狀態
  • 高16位未使用:這些位在當前實現中未被使用,但為未來擴展提供了空間
    在這里插入圖片描述

終結位:當設置時,表示該對象只能通過終結器(Finalizer)進行訪問。

重映射位(Remap):表示在垃圾收集轉移過程后,對象的引用關系已經更新。

Marked0和Marked1:用于標記對象是否可達,是垃圾收集過程中的重要標識。

五、ZGC的內存劃分

與G1不同的是,ZGC對Zpage的劃分更加精細,旨在實現更精確的內存管理和控制,從而進一步減少垃圾回收過程中的停頓時間。ZGC的Zpage可以分為三類,分別是小區域、中區域和大區域,它們各自具有不同的容量和用途:

  • 小區域(Small Zpage):每個小區域的大小為2MB,專門用于存放小型對象,即大小不超過256KB的對象。這種劃分方式有助于減少內存碎片,并提高內存利用率。
  • 中區域(Medium Zpage):每個中區域的大小為32MB,用于存放中等大小的對象,即大小在256KB到4MB之間的對象。中區域的引入進一步擴展了ZGC的適用范圍,使其能夠處理更大規模的內存需求。
  • 大區域(Large Zpage):大區域的大小則根據實際需求動態分配,每個大區域只保存一個大于4MB的大型對象。這種設計允許ZGC在必要時為大型對象提供足夠的連續內存空間。

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

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

相關文章

區間動態規劃

線性 DP 的一種,簡稱為「區間 DP」。以「區間長度」劃分階段,以兩個坐標(區間的左、右端點)作為狀態的維度。一個狀態通常由被它包含且比它更小的區間狀態轉移而來。 一、概念 間 DP 的主要思想就是:先在小區間內得到…

4. 數據類型

4.1 數據類型分類 分類 數據類型 說明 數值類型 BIT(M) 位類型。M指定位數,默認值1,范圍1 - 64 TINYINT [UNSIGNED] 帶符號的范圍 -128 ~ 127,無符號范圍0 ~ 255,默認有符號 BOOL 使用0和1表示真和假 SMALLINT [UNSIGNED] 帶符號是…

設計模式-2 結構型模式

一、代理模式 1、舉例 海外代購 2、代理基本結構圖 3、靜態代理 1、真實類實現一個接口,代理類也實現這個接口。 2、代理類通過真實對象調用真實類的方法。 4、靜態代理和動態代理的區別 1、靜態代理在編譯時就已經實現了,編譯完成后代理類是一個實際…

vue+element-ui一個頁面有多個子組件組成。子組件里面有各種表單,實現點擊enter實現跳轉到下一個表單元素的功能。

一個父組件里面是有各個子組件的form表單組成的。 我想實現點擊enter。焦點直接跳轉到下一個表單元素。 父組件就是由各個子組件構成 子組件就像下圖一樣的都有個el-form的表單。 enterToTab.js let enterToTab {}; (function() {// 返回隨機數enterToTab.addEnterListener …

Open SSL 3.0相關知識以及源碼流程分析

Open SSL 3.0相關知識以及源碼流程分析 編譯 windows環境編譯1、工具安裝 安裝安裝perl腳本解釋器、安裝nasm匯編器(添加到環境變量)、Visual Studio編譯工具 安裝dmake ppm install dmake # 需要過墻2、開始編譯 # 1、找到Visual Studio命令行編譯工具目錄 或者菜單欄直接…

【Redis】筆記|第5節|Redisson實現高并發分布式鎖核心源碼

一、加鎖流程 1. 核心方法調用鏈 RLock lock redisson.getLock("resource"); lock.lock(); // 阻塞式加鎖? lockInterruptibly()? tryAcquire(-1, leaseTime, unit) // leaseTime-1表示啟用看門狗? tryAcquireAsync()? tryLockInnerAsync() // 執行Lua腳本 2…

基于React + TypeScript構建高度可定制的QR碼生成器

前言 在現代Web應用中,QR碼已成為連接線上線下的重要橋梁。本文將詳細介紹如何使用React TypeScript Vite構建一個功能強大、高度可定制的QR碼生成器,支持背景圖片、文本疊加、HTML模塊、圓角導出等高級功能。 前往試試 項目概述 技術棧 前端框架:…

【MATLAB代碼】制導——三點法,二維平面下的例程|運動目標制導,附完整源代碼

三點法制導是一種導彈制導策略,主要用于確保導彈能夠準確追蹤并擊中移動目標。該方法通過計算導彈、目標和制導站之間的相對位置關系,實現對目標的有效制導。 本文給出MATLAB下的三點法例程,模擬平面上捕獲運動目標的情況訂閱專欄后可直接查看源代碼,粘貼到MATLAB空腳本中即…

Ubuntu22.04 安裝 IsaacSim 4.2.0

1. 從官網下載 IsaacSim 4.2.0 安裝包 https://download.isaacsim.omniverse.nvidia.com/isaac-sim-standalone%404.2.0-rc.18%2Brelease.16044.3b2ed111.gl.linux-x86_64.release.zip 2. 查閱 Workstation Installation 安裝方式 Workstation Installation — Isaac Sim Do…

開源量子模擬引擎:Quantum ESPRESSO本地部署教程,第一性原理計算輕松入門!

一、介紹 Quantum ESPRESSO 是一個用于電子結構計算和納米尺度材料建模的開源計算機代碼集成套件,專門用于進行第一性原理(第一性原理)計算,涵蓋了電子結構、晶體學和材料性能的模擬。 Quantum ESPRESSO GPU 版本支持GPU加速&am…

PVE 虛擬機安裝 Ubuntu Server V24 系統 —— 一步一步安裝配置基于 Ubuntu Server 的 NodeJS 服務器詳細實錄1

前言 最近在基于 NodeJS V22 寫一個全棧的項目,寫好了,當然需要配置服務器部署啦。這個過程對于熟手來說,還是不復雜的,但是對于很多新手來說,可能稍微有點困難。所以,我把整個過程全部記錄一下。 熟悉我…

【JUC】深入解析 JUC 并發編程:單例模式、懶漢模式、餓漢模式、及懶漢模式線程安全問題解析和使用 volatile 解決內存可見性問題與指令重排序問題

單例模式 單例模式確保某個類在程序中只有一個實例,避免多次創建實例(禁止多次使用new)。 要實現這一點,關鍵在于將類的所有構造方法聲明為private。 這樣,在類外部無法直接訪問構造方法,new操作會在編譯…

2. 庫的操作

2.1 創建數據庫 語法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存儲編碼 [DEFAULT] COLLATE collation_name # 校驗集: 比較/選擇/讀…

道可云人工智能每日資訊|北京農業人工智能與機器人研究院揭牌

道可云人工智能&元宇宙每日簡報(2025年6月3日)訊,今日人工智能&元宇宙新鮮事有: 北京農業人工智能與機器人研究院揭牌 5月30日,北京市農業農村局、北京市海淀區人民政府、北京市農林科學院共同主辦北京農業人…

【JSON-to-Video】設置背景視頻片斷

目錄 設置bgVideo字段 1. 設置bgVideo.videoList字段 2. 設置randomPlay字段 3. 設置complete字段 4. 調用API,制作視頻 歡迎來到JSON轉視頻系列教程。今天要教大家如何添加背景視頻片斷,在視頻制作中,巧妙運用背景視頻,能為…

星閃開發之Server-Client 指令交互控制紅燈亮滅案例解析(SLE_LED詳解)

系列文章目錄 星閃開發之Server-Client 指令交互控制紅燈亮滅的全流程解析(SLE_LED詳解) 文章目錄 系列文章目錄前言一、項目地址二、客戶端1.SLE_LED_Client\inc\SLE_LED_Client.h2.SLE_LED_Client\src\SLE_LED_Client.c頭文件與依賴管理宏定義與全局變…

Linux shell練習題

Shell 1. 判斷~/bigdata.txt 是否存在,若已存在則打印出”該文件已存在“,如不存在,則輸出打印:”該文件不存在“ if [ -f ./bigdata.txt ];then echo "文件存在" else echo "文件不存在" fi2. 判斷~/bigd…

Linux基本指令(三)

接上之前的文章,咱繼續分享Linux的基本指令,Linux指令比較多,很難全部記住需要做筆記對常用的指令進行記錄,方便以后復習查找,做筆記也可以對知識理解更加深刻。 目錄 時間相關指令 date顯示 時間戳 cal指令 ?編…

WebRTC中sdp多媒體會話協議報文詳細解讀

sdp介紹 在WebRTC(Web實時通信)中,SDP(Session Description Protocol)是用來描述和協商多媒體會話的協議。它定義了會話的參數和媒體流的信息,如音視頻編碼格式、傳輸方式、網絡地址等。SDP是WebRTC中一個…

【MySQL】 約束

一、約束的定義 MySQL 約束是用于限制表中數據的規則,確保數據的 準確性 和 一致性 。約束可以在創建表時定義,也可以在表創建后通過修改表結構添加。 二、常見的約束類型 2.1 NOT NULL 非空約束 加了非空約束的列不能為 NULL 值,如果可以…