13. G1垃圾回收器

1. JVM介紹和運行流程-CSDN博客

2. 什么是程序計數器-CSDN博客

3. java 堆和 JVM 內存結構-CSDN博客

4. 虛擬機棧-CSDN博客

5. JVM 的方法區-CSDN博客

6. JVM直接內存-CSDN博客

7. JVM類加載器與雙親委派模型-CSDN博客

8. JVM類裝載的執行過程-CSDN博客

9. JVM垃圾回收-CSDN博客

10. 垃圾回收的算法-CSDN博客

11. JVM中的分代回收-CSDN博客

12. JVM的垃圾回收器-CSDN博客

13. G1垃圾回收器-CSDN博客

14. 垃圾回收的引用區別-CSDN博客

15. JVM調優的參數設置-CSDN博客

16. JVM調優工具-CSDN博客


1. G1垃圾回收器

G1(Garbage-First)垃圾回收器是Java HotSpot虛擬機中一種面向服務端應用的垃圾回收器,于JDK 7中首次推出,并在JDK 9及以后成為默認的垃圾回收器

內存布局

  1. 區域劃分

    • 堆被劃分為多個大小相等的Region(默認約2048個)

    • 每個Region可以是Eden、Survivor或Old區

    • 還有一種特殊的Humongous區用于存儲大對象(大小超過Region 50%的對象)

  2. 分代管理

    • 仍然保留分代概念,但物理上不再連續

    • 年輕代:一組Region(Eden+Survivor)

    • 老年代:另一組Region


2. G1的三個核心階段

2.1 年輕代回收(Young GC) —— 一階段

特點

  • STW(Stop-The-World):完全暫停應用線程

  • 觸發條件:Eden區填滿時自動觸發

  • 目標:快速回收年輕代(Eden + Survivor區)

工作流程

  1. 根掃描:標記GC Roots直接引用的對象。

  2. 存活對象標記:通過可達性分析標記年輕代存活對象。

  3. 復制/晉升

    • 存活對象被復制到Survivor區(復制算法)

    • 達到晉升閾值(-XX:MaxTenuringThreshold)的對象晉升到老年代。

  4. 區域清空:回收后的Eden區和部分Survivor區被標記為空閑。

關鍵點

  • 僅處理年輕代Region,耗時短(通常幾毫秒到幾十毫秒)。

  • 通過-XX:G1NewSizePercent-XX:G1MaxNewSizePercent動態調整年輕代大小。

圖示過程:

  • 初始時,所有區域都處于空閑狀態
  • 創建了一些對象,挑出一些空閑區域作為伊甸園區存儲這些對象
  • 當伊甸園需要垃圾回收時,挑出一個空閑區域作為幸存區,用復制算法復制存活對象,需要暫停用戶線程

E 表示:Eden 區

S 表示:Survivor 區

  • 隨著時間流逝,伊甸園的內存又有不足
  • 將伊甸園以及之前幸存區中的存活對象,采用復制算法,復制到新的幸存區,其中較老對象晉升至老年代?


2.2 并發標記周期(Concurrent Marking Cycle)—— 二階段

特點

  • 部分并發:大部分階段與應用線程并發執行

  • 觸發條件:老年代占用達到閾值(默認45%,通過-XX:InitiatingHeapOccupancyPercent調整)

  • 目標:全局標記堆中存活對象,確定回收優先級

分階段流程

  1. 初始標記(Initial Mark,STW)

    • 短暫暫停,標記GC Roots直接關聯的對象。

    • 通常與年輕代回收一起執行(借道Young GC)。

  2. 并發標記(Concurrent Mark)

    • 與應用線程并發,遍歷整個堆,標記所有可達對象。

    • 使用SATB(Snapshot-At-The-Beginning)算法處理并發期間的對象變化。

  3. 最終標記(Remark,STW)

    • 處理并發標記期間漏標的對象(通過寫屏障記錄的變化)。

    • 引用處理(如清理軟引用/弱引用)。

  4. 清理(Cleanup,STW)

    • 統計各Region的存活對象比例,排序回收價值(垃圾最多的優先)。

    • 不實際回收內存,但可能回收完全空閑的Region。

關鍵點

  • 并發標記周期為后續混合回收提供數據基礎。

  • 通過-XX:ConcGCThreads可調整并發標記線程數。

圖示過程:

當老年代占用內存超過閾值(默認是45%)后,觸發并發標記,這時無需暫停用戶線程


2.3?混合回收(Mixed GC)—— 三階段

特點

  • STW:暫停應用線程

  • 觸發條件:并發標記周期完成后,老年代Region達到回收閾值

  • 目標:同時回收年輕代和部分老年代(選擇垃圾比例高的Region)

工作流程

  1. 年輕代回收:與Young GC相同,處理Eden和Survivor區。

  2. 老年代回收

    • 根據并發標記的結果,選擇垃圾比例最高的老年代Region(Garbage-First策略)。

    • 存活對象被復制到其他Region(壓縮算法減少碎片)。

  3. 多次增量回收

    • 可能分多次完成老年代回收,每次回收部分Region以控制停頓時間。

關鍵點

  • 通過-XX:G1MixedGCLiveThresholdPercent設置Region存活對象閾值(默認85%,存活對象過多則跳過)。

  • 通過-XX:G1MixedGCCountTarget控制混合回收的批次(默認8次)。

圖示過程:

  • 并發標記之后,會有重新標記階段解決漏標問題,此時需要暫停用戶線程。
  • 這些都完成后就知道了老年代有哪些存活對象,隨后進入混合收集階段。
  • 此時不會對所有老年代區域進行回收,而是根據暫停時間目標優先回收價值高(存活對象少)的區域(這也是 Gabage First 名稱的由來)

?混合收集階段中,參與復制的有 eden、survivor、old

復制完成,內存得到釋放。進入下一輪的新生代回收、并發標記、混合收集


三階段關系圖?


Full GC(后備方案)

異常情況:Full GC

當G1無法滿足回收需求(如并發模式失敗或晉升失敗)時,會退化為單線程的Serial Old GC(Full GC),導致長時間停頓。應通過調整參數(如增加堆大小、降低InitiatingHeapOccupancyPercent)避免。


3. 問題總結

3.1 三階段總結

G1 通過這三個階段的配合,實現了低延遲高吞吐的平衡,尤其適合大內存、多核CPU的場景。

階段并發性目標觸發條件
年輕代回收STW快速回收Eden/SurvivorEden區滿
并發標記周期部分并發標記全堆存活對象,確定優先級老年代占用達閾值(默認45%)
混合回收STW回收年輕代+高垃圾老年代Region并發標記周期完成后

3.2 說一下G1垃圾回收?

  • 應用于新生代和老年代,在JDK9之后默認使用G1
  • 劃分成多個區域,每個區域都可以充當eden,survivor,old,humongous其中 humongous 專為大對象準備
  • 采用復制算法
  • 響應時間與吞吐量兼顧
  • 分成三個階段:年輕代回收(stw)、并發標記周期(重新標記stw)、混合回收
  • 如果并發失敗(即回收速度趕不上創建新對象速度),會觸發Full GC

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

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

相關文章

算法學習筆記:13.歸并排序——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

歸并排序是一種基于分治策略的經典排序算法,由約翰?馮?諾依曼在 1945 年提出。它以穩定的 O (nlogn) 時間復雜度和良好的可并行性,在大規模數據排序場景中占據重要地位。與快速排序的 “先分區后排序” 不同,歸并排序采用 “先排序后合并”…

Kotlin基礎學習記錄

變量和函數 變量 // val為常量,一旦賦值就不可變 val a 10 val a: Int 10 a 3 // 報錯// var為變量 var a 10 a 3 var b: Int 20 b 2函數fun add(a: Int, b: Int): Unit {a b // 報錯,參數默認val }fun add(a: Int, b: Int) {var x: Int ax b …

【C#】GraphicsPath的用法

在 C# 中,GraphicsPath 是 GDI 提供的一個非常強大的類,用于創建和操作復雜圖形路徑。它可以用來繪制直線、曲線、多邊形等形狀,并支持判斷點是否在路徑內或路徑的輪廓上。一、基本概念GraphicsPath 類功能:添加各種幾何圖形&…

C語言32個關鍵字

文章目錄數據類型1、數據類型(12個)控制語句2、控制語句關鍵字(12個)存儲類型3、存儲類型關鍵字(4個)其他關鍵字4、其他關鍵字(4個)?一共32個關鍵字分為 數據類型 1、數據類型&am…

粒子濾波|粒子濾波的相關算法理論介紹

在自動控制、導航、目標跟蹤等眾多領域,系統狀態估計是獲取真實狀態的關鍵環節。由于觀測信號常受噪聲干擾,濾波技術成為提取可靠信息的核心手段。本文將圍繞目標跟蹤技術中的濾波算法理論展開,重點解析粒子濾波框架的原理與應用。一、動態系…

Jenkins+Gitee+Docker容器化部署

寫在前文 本文主要是通過Jenkins的maven項目版本GiteeDocker-maven插件來進行部署的,本文沒有使用dockerfile/docker-compose。 本文默認已經安裝了Docker 1、安裝Jenkins Step1、創建文件夾當作映射jenkins的home文件夾 mkdir /app/jenkins Step2、賦權&#xff…

[Meetily后端框架] 多模型-Pydantic AI 代理-統一抽象 | SQLite管理

第5章:人工智能模型交互(Pydantic-AI 代理) 歡迎回來! 在上一章第四章:文字記錄處理邏輯中,我們學習了TranscriptProcessor如何將冗長的會議記錄分解為稱為"塊"的較小片段,因為人工…

利用DeepSeek實現rust調用duckdb動態鏈接庫的duckdb CLI

提示詞:請用rust調用duckdb-rs實現一個duckdb CLI,支持語法突出顯示和計時,還支持命令行管道輸入輸出 Cargo.toml [package] name "duckdb-cli" version "0.1.0" edition "2024"[dependencies] duckdb "1.3.1&qu…

C++,從匯編角度看《虛擬繼承的邪惡》

刷到一篇文章&#xff1a; 作者&#xff1a; 原文&#xff1a;虛擬繼承的邪惡 討論到這樣的一個程序&#xff0c;最終輸出什么&#xff1f;&#xff1f;&#xff1f; 代碼有簡化命名 using namespace std;class A { public:A(int a 0) : v(a) {};int v; };template <type…

多 Agent 強化學習實踐指南(一):CTDE PPO 在合作捕食者-獵物游戲中的應用詳解

我們來詳細講解如何在合作捕食者-獵物游戲中結合 PPO (Proximal Policy Optimization) 算法。我們將聚焦于 CTDE&#xff08;Centralized Training, Decentralized Execution&#xff0c;集中訓練、分散執行&#xff09; 模式&#xff0c;因為這是處理合作多 Agent 任務的常用且…

Web應用文件上傳安全設計指南

引言 在當今的Web應用中&#xff0c;文件上傳功能已成為基礎且必要的服務能力&#xff0c;但不當的設計可能帶來目錄遍歷、代碼注入、服務端資源耗盡等安全風險。本文從威脅模型、安全設計原則、技術實現三個維度&#xff0c;系統闡述安全文件上傳架構的設計要點。 一、威脅模型…

用 React Three Fiber 實現 3D 城市模型的擴散光圈特效

本文介紹了如何使用 React Three Fiber&#xff08;R3F&#xff09;和 Three.js 實現一個從中心向外擴散的光圈特效&#xff08;DiffuseAperture 組件&#xff09;&#xff0c;并將其集成到城市 3D 模型&#xff08;CityModel 組件&#xff09;中。該特效通過動態調整圓柱幾何體…

【牛客刷題】COUNT數字計數

文章目錄 一、題目介紹二、題解思路三、算法實現四、復雜度分析五 、關鍵步驟解析5.1 數字分解5.2 三種情況處理5.2.1 情況1: d < c u r d < cur d<cur(完整周期)5.2.2 情況2: d = c u r d = cur d=cur(混合周期)5.2.3 情況3: d > c u r d > cur d>cu…

AGV穿梭不“迷路”CCLinkIE轉Modbus TCP的銜接技巧

在AGV控制系統集成中&#xff0c;工程師常面臨一個現實難題&#xff1a;如何讓CCLinkIE總線與Modbus TCP設備實現高效通信&#xff1f;這種跨協議的連接需求&#xff0c;往往需要耗費大量時間調試。本文將通過實際案例解析&#xff0c;為制造行業工程師提供可復用的解決方案。【…

【代碼隨想錄】刷題筆記——哈希表篇

目錄 242. 有效的字母異位詞 349. 兩個數組的交集 202. 快樂數 1. 兩數之和 454. 四數相加 II 383. 贖金信 15. 三數之和 18. 四數之和 242. 有效的字母異位詞 思路 代碼 class Solution {public boolean isAnagram(String s, String t) {if (s.length() ! t.length()…

Python爬蟲實戰:研究messytables庫相關技術

1. 引言 在當今數字化時代,互聯網上存在著大量有價值的數據。然而,這些數據通常以不規則的格式存在,尤其是表格數據,可能包含復雜的表頭、合并單元格、不規則布局等問題。傳統的數據處理工具往往難以應對這些挑戰。 網絡爬蟲技術可以幫助我們從網頁上自動提取數據,而 mes…

Vue3的組件通信方式

通信方式適用層級數據流向復雜度Props/Emits父子組件單向/雙向★☆☆v-model父子組件雙向★☆☆Provide/Inject跨層級組件自上而下★★☆事件總線任意組件任意方向★★★Pinia/Vuex全局狀態任意方向★★☆Refs模板引用父子組件父→子★☆☆作用域插槽父子組件子→父★★☆Web W…

創客匠人:大健康創始人IP如何用“社會責任”構建品牌護城河

一、商業與責任的失衡困局部分大健康IP將利潤置于首位&#xff0c;甚至犧牲用戶利益&#xff0c;導致品牌形象脆弱。某保健品公司因夸大宣傳被曝光后&#xff0c;盡管銷量曾達千萬&#xff0c;卻因缺乏社會認同&#xff0c;一夜之間崩塌&#xff0c;證明沒有社會責任支撐的商業…

AI:機器人未來的形態是什么?

機器人未來的形態將受到技術進步、應用場景需求和社會接受度的綜合影響&#xff0c;以下是對未來機器人形態的預測&#xff0c;涵蓋技術趨勢、設計方向和應用場景&#xff1a; 1. 形態多樣化與通用化 人形機器人&#xff08;Humanoid Robots&#xff09;&#xff1a; 趨勢&…

創建 UIKit 項目教程

一、打開 XCode&#xff0c;選擇 iOS 下的 App&#xff0c;然后點 Next二、Interface 選擇 Storyboard&#xff0c;然后點 Next三、刪掉 Main.storyboard四、刪掉 SceneDelegate.swift五、AppDelegate.swift 只保留第一個函數六、在 AppDelegate.swift 文件里的 application 函…