G1 GC基本邏輯


1 ?MixedGC基本過程
在G1GC中,有兩種主要的垃圾回收過程:Young GC和Mixed GC。這兩者都是為了回收堆內存中的垃圾對象,但是他們關注的區域和工作方式有所不同。

Young GC:

Young GC主要負責回收Young Generation(包括Eden區和Survivor區)。大多數新創建的對象都首先在Eden區分配,在一段時間后,如果這些對象仍然存活,它們將被移動到Survivor區或Old區。Young GC通常會頻繁發生,因為大多數對象的生命周期都很短,很快就會變成垃圾可以被回收。

Mixed GC:

與Young GC不同,Mixed GC不僅回收Young Generation,還會回收部分Old Generation。Mixed GC發生的條件是在并發標記周期結束后,也就是說,它會在完成全堆的并發標記之后進行。在Mixed GC中,G1GC會選擇一些可以回收的老年代區域進行清理,這樣可以在不進行Full GC的情況下,盡可能地清理掉一些長時間存活的垃圾對象

在G1GC中,實際上只有YoungGC. 或者說MixedGc是跟隨YoungGC
1 Mixed GC觸發條件:

1)如果堆內存的使用率超過了一個閾值(默認是45%,可以通過-XX:InitiatingHeapOccupancyPercent參數進行調整),那么將會啟動一個并發周期,而Mixed GC則在并發周期結束后開始。
2)老年代的區域已經滿了。G1GC會盡可能地避免Full GC,所以當老年代的區域已經滿了,并且并發標記已經完成,G1GC會觸發Mixed GC以回收老年代的部分區域
? ?老年代的使用率達到 -XX:G1OldCSetRegionThresholdPercent 參數設置的閾值,G1 GC 將會盡管不滿足 G1HeapWastePercent 的要求,也會強制執行 Mixed GC,以防止老年代填滿導致 Full GC


MixedGC階段:
1)初始標記階段
這個過程需要進入Stop the World的,僅僅只是標記一下GC Roots直接能引用的對象,這個過程速度是很快的。如下圖,先停止系統程序的運行,然后對各個線程棧內存中的局部變量代表的GC Roots,以及方法區中的類靜態變量代表的GC Roots,進行掃描,標記出來他們直接引用的那些對象
?
2)并發標記階段
這個階段會允許系統程序的運行,同時進行GC Roots追蹤,從GC Roots開始追蹤所有的存活對象,并對這個過程對象的變化做記錄,比如哪些對象失去了引用,哪些對象是新建的。如下圖所示。(這個階段也是很耗時的,要追蹤全部存活的對象,但跟系統并發運行,影響不大)

3)最終標記階段
這個階段會進入Stop the World,系統程序是禁止運行的,但是會根據并發標記階段記錄的那些對象修改,最終標記一下有哪些存活對象,有哪些是垃圾對象。

4)混合回收階段

? ?計算存活對象數量:在并發標記階段,垃圾收集器會遍歷對象圖并標記存活對象。這個過程可以幫助G1GC了解每個區域的存活對象數量。
? ?計算回收收益:根據每個區域的存活對象數量,G1GC會計算回收收益,即回收某個區域可以釋放多少空間。
? ?選擇回收集合:在計算完回收收益后,G1GC會根據預設的暫停時間目標(例如通過-XX:MaxGCPauseMillis參數設置)來選擇哪些區域應該被包含在回收集合中。這個過程中,G1GC會優先選擇回收收益較高的區域。

? ?這個階段G1允許多次執行混合回收,也就是說先停止系統工作,執行回收,恢復系統運行,再停止系統運行,再回收,再恢復…這么一個流程。每次回收的間隔是由G1自己控制的,回收執行次數可以通過參數-XX:G1MixedGCCountTarget來設置,這個參數默認回收次數是8次,同時有一個參數-XX:G1HeapWastePercent,默認值是整個堆大小5%,就是說當前回收集合內即將空出來的區域大于整個堆的5%,就會立即停止混合回收了。正常默認回收次數是8次,但是可能到了4次,發現空閑Region大于整個堆的5%,就不會再進行后續回收了。
? ?G1HeapWastePercent參數(默認5%),控制了回收集合內總的region的內存大小,
? ? ? ? ?設置太大,
?? ??? ? ? ? ?則經過可能最多8次后還是達不到條件這個閾值。這可能會導致垃圾回收的暫停時間變長,對應用程序的響應時間產生影響。
? ? ? ? ? ? ? 同時,如果 G1 GC 將這種回收效益不高的 region 也加入到回收集合(CSet)中,雖然能回收一些垃圾,但大部分空間仍然被活動對象占據,該 region 的空間利用率并未顯著提高。
? ? ? ? ? ? ? ? ? ?而實際上這些 region 的可回收空間并不多,這就造成了空間的浪費。也導致額外的 CPU 時間被用于回收這些 region
? ? ? ? ? ? ? 如果內存使用效率較低,可能間接導致內存使用率較快達到 IHOP 閾值 ?InitiatingHeapOccupancyPercent,從而導致頻繁觸發并發標記。
? ? ? ? ?設置太小,
?? ??? ? ? ? ? 導致mixed gc 很快就結束。進而導致很多需要回收的region得不到回收,也會影響內存里利用率。能使堆內存使用率更容易達到 -XX:InitiatingHeapOccupancyPercent(IHOP)閾值,從而觸發更頻繁的并發標記。
? ? ? ? ? ? ? ? 如果堆空間使用率持續上升,可能會觸發 Full GC,從而導致更長的垃圾收集暫停時間。
?? ??? ??? ??? ?
?? ??? ??? ??? ?
? ?如果發現老年代中可回收的對象不足以滿足預設的暫停時間目標(由 -XX:MaxGCPauseMillis 參數設置):
? ?G1 GC 可能會提前結束 Mixed GC 狀態,避免不必要的工作,因為繼續執行 Mixed GC 可能無法釋放足夠的空間,卻會消耗更多的 CPU 時間。
? ?
? ? ? ? a)通常是指老年代中可以被回收并釋放的對象數量不足,也就是說,老年代中的大部分對象都還被程序所使用,無法被回收。
?? ? ? ?b)也可能是短壽命的對象,這些對象在年輕代就被回收了,而長壽命的對象(通常會被分配到老年代)相對較少。?

??當老年代中可回收的對象超過預設的暫停時間,G1 GC 會提前結束 Mixed GC,避免回收時間過長,以盡量滿足預設的暫停時間目標。
? 但是,如果經常發生, 這可能導致老年代中未回收的對象增加,從而降低堆內存的使用效率。
? 如果經常出現這種情況,可能需要調整 G1 GC 的配置參數或優化應用代碼以減少老年代中的可回收對象。例如,可以增加-XX:G1OldCSetRegionThresholdPercent和-XX:G1HeapWastePercent的值,以允許 G1 GC 在 Mixed GC 階段回收更多的老年代 Region,或者優化應用代碼以減少長壽命對象的生成。
?

對于已經被加入到 Collection Set (CSet) 中的 region,無論它們是年輕代的還是老年代的,G1 GC 都會在當前的 GC 周期中進行回收。?? ?如果沒有可回收對象,則直接轉YoungGC.


2 ? ? G1GC 新生代是動態的:
-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent,分別為新生代比例的設定數值的下限和上限,默認值分別為5%和60%。G1會根據實際的GC情況(主要是暫停時間)來動態的調整新生代的大小,主要是調整Eden Region的個數。

以下是 G1 GC 動態調整新生代大小的幾個重要因素:

暫停時間目標:G1 GC 通過 -XX:MaxGCPauseMillis 參數設置暫停時間目標。為了盡量滿足這個目標,G1 GC 可以根據前幾次垃圾收集的數據,動態地調整新生代的大小,以影響下一次垃圾收集的暫停時間。

應用程序行為:G1 GC 會根據應用程序的行為,如對象分配速率和對象存活率,動態地調整新生代的大小。對于分配密集型的應用,G1 GC 可能會增大新生代的大小以容納更多的對象。對于對象存活率高的應用,G1 GC 可能會減小新生代的大小以避免存活對象過多導致的復制成本。

并發標記:G1 GC 會盡量在并發標記階段結束后立即觸發一次 Mixed GC。為了保證并發標記能夠在合適的時間結束,G1 GC 會根據堆內存使用率和歷史數據,動態地調整新生代的大小。

因此,新生代的動態性是 G1 GC 實現可預測的停頓時間和高吞吐量目標的一個重要方式。

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

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

相關文章

跟著GPT學設計模式之建造者模式

Builder 模式,中文翻譯為建造者模式或者構建者模式,也有人叫它生成器模式。允許你創建不同口味的對象同時避免構造器污染。當一個對象可能有幾種口味,或者一個對象的創建涉及到很多步驟時會很有用。 現實世界例子:想象一個角色扮…

Vue:用IDEA開發Vue,標簽語法爆紅問題處理

一、場景描述 我在IDEA中,學習Vue課程。 入門學習時,是在html文件中,script引入vue.js文件方式。 此時,在html文件中用v-標簽,爆紅。 二、解決辦法 打開 菜單欄 File - Settings 選擇 Editor - Files Type&#xf…

《每天一個Linux命令》 -- (5)通過sshkey密鑰登錄服務器

歡迎閱讀《每天一個Linux命令》系列!在本篇文章中,將介紹通過密鑰生成,使用公鑰連接管理服務器。 概念 SSH 密鑰是用于安全地訪問遠程服務器的一種方法。SSH 密鑰由一對密鑰組成:公鑰和私鑰。公鑰存儲在遠程服務器上,…

軟件工程復習

一、題型 單項選擇題 20分 填空題 10分 判斷題 10分 簡答題 18分 應用題 12分 綜合題 30分 軟件程序數據文檔 軟件是無形的、不可見的邏輯實體 20世紀60年代末爆發軟件危機 軟件危機是指軟件在開發與維護過程中遇到的一系列嚴重的問題 …

理解 GET、POST、PATCH 和 DELETE 請求的參數傳遞方式

理解 GET、POST、PATCH 和 DELETE 請求的參數傳遞方式 本文將向您介紹在使用 GET、POST、PATCH 和 DELETE 請求時如何傳遞參數。通過詳細解釋每種請求的參數傳遞方式和示例代碼,您將了解如何正確地將數據發送到服務器并與之交互。 GET 請求的參數傳遞方式 在 GET…

CentOS 7.9安裝寶塔面板,安裝gitlab服務器

docker安裝方式比較慢,安裝包1.3GB 安裝后啟動很慢 docker logs q18qgztxdvozdv_gitlab-ce-gitlab-1 docker ps docker exec -it q18qgztxdvozdv_gitlab-ce-gitlab-1 sh cd /etc/gitlab cat initial_root_password 軟件商店安裝方式,失敗了2023.12…

clickhouse刪除partition分區數據

clickhouse分布式表tencent_table_20231208_DIST,本地表tencent_table_20231208_local; 30臺clickhouse存儲服務器; 本地表:tencent_table_20231208_local CREATE TABLE tencent_sz.tencent_table_20231208_local (id Int64 DEFA…

hook其他調試技巧

輸出堆棧信息 通過 android.util.Log 輸出當前線程的堆棧跟蹤信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…

機器學習--稀疏學習

前置知識: 通常學習一次模型的過程如下:我們普遍為了獲取更好的模型效果,直接對原始數據學習,會造成過擬合、需要特征提取; 而若特征提取完后依舊有很多特征,還是會容易過擬合。這時候就需要特征降維和特…

[leetcode 前綴和]

525. 連續數組 M :::details 給定一個二進制數組 nums , 找到含有相同數量的 0 和 1 的最長連續子數組,并返回該子數組的長度。 示例 1: 輸入: nums [0,1] 輸出: 2 說明: [0, 1] 是具有相同數量 0 和 1 的最長連續子數組。示例 2: 輸入: nums [0,1,0] 輸出: …

笙默考試管理系統-MyExamTest----codemirror(48)

笙默考試管理系統-MyExamTest----codemirror(48) 目錄 笙默考試管理系統-MyExamTest----codemirror(48) 一、 笙默考試管理系統-MyExamTest----codemirror 二、 笙默考試管理系統-MyExamTest----codemirror 三、 笙默考試管…

C/C++端口復用SO_REUSEADDR(setsockopt參數),test ok

端口復用最常用的用途應該是防止服務器重啟時之前綁定的端口還未釋放或者程序突然退出而系統沒有釋放端口。這種情況下如果設定了端口復用,則新啟動的服務器進程可以直接綁定端口。如果沒有設定端口復用,綁定會失敗,提示ADDR已經在使用中——…

前端學習--React(5)

一、useReducer 管理相對復雜的狀態數據 定義一個reducer函數,根據action值的不同返回不同的狀態 在組件中調用useReducer并傳入reducer函數和狀態的初始值 事件發生時,通過dispatch函數分派一個對象,即通知reducer具體返回哪個狀態對應的操…

STM32 寄存器配置筆記——USART DMA發送

一、DMA介紹 直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳 輸。無須 CPU 干預,數據可以通過 DMA 快速地移動,這就節省了 CPU 的資源來做其他操作。當產品對于時序要求較嚴格時,外設使用DMA的方式能夠減…

深入了解Java 8日期時間新玩法:DateTimeFormatter與ZoneOffset的使用

推薦語 在這篇文章中,我們將深入探討Java中的DateTimeFormatter和ZoneOffset類的功能和使用方法。這些類是在Java 8中引入的新的日期時間API的一部分,它們為我們提供了更靈活、更易用的日期和時間處理能力。盡管這些類在Java 8中已經出現,但…

ELK(六)—Filebeat安裝部署

目錄 一、介紹1.1特點1.2使用原因1.3結構圖1.4工作流程 二、安裝部署2.1下載2.2啟動2.3監控日志文件2.4自定義字段 三、連接Elasticsearch四、工作原理 一、介紹 Filebeat是一個輕量級的日志和文件數據收集器,屬于Elastic Stack(ELK Stack)中…

近期Chrome瀏覽器 不知哪個版本升級后原先http強制跳轉到https,導致服務端302強制跳轉到http也沒反應

關于Chrome更新http強制跳轉到https解決方法 近期Chrome瀏覽器 不知哪個版本升級后原先http強制跳轉到https,導致服務端302強制跳轉到http也沒反應一、F12檢查加載的Response Headers中有沒有Non-Authoritative-Reason二、找了資料后得到解決方案:三、找…

云原生數據庫是什么?它的作用是啥?

目前來說,各廠商的云原生數據庫在演進路線上分成了兩個略有不同的路徑來解決不同的問題。 一種是各大公有云廠商選擇的,優先保證上云兼容性的路線,就是基于存算分離架構對傳統數據庫進行改造的路線:通過把大量的日志操作放到后臺…

插入排序——直接插入排序和希爾排序(C語言實現)

文章目錄 前言直接插入排序基本思想特性總結代碼實現 希爾排序算法思想特性總結代碼實現 前言 本博客插入排序動圖和希爾排序視頻參考大佬java技術愛好者,如有侵權,請聯系刪除。 直接插入排序 基本思想 直接插入排序是一種簡單的插入排序法&#xff…

圖空圖床圖片外鏈系統源碼-支持自定義權限策略-圖片大小格式

含視頻搭建教程。 大致功能: 支持本地等多種第三方云儲存 AWS S3、阿里云 OSS、騰訊云 COS、七牛云、又拍云、SFTP、FTP、WebDav、Minio多種數據庫驅動支持,MySQL 5.7、PostgreSQL 9.6、SQLite 3.8.8、SQL Server 2017支持配置使用多種緩存驅動&#xff…