垃圾收集器ParNewCMS與底層三色標記算法詳解

垃圾收集技術詳解筆記

1. 分代收集理論

當前虛擬機的垃圾收集采用分代收集算法,根據對象存活周期將內存分為不同代區,以優化回收效率。

  • 核心分區
    • 新生代(Young Generation):對象存活周期短,約99%對象在每次回收時死亡。
    • 老年代(Old Generation):對象存活率高,無額外分配擔保空間。
  • 算法選擇
    • 新生代:適用復制算法(效率高,只需復制少量存活對象)。
    • 老年代:適用標記-清除或標記-整理算法(避免復制開銷,但速度慢10倍以上)。
2. 垃圾收集算法詳解
2.1 標記-復制算法

解決效率問題,將內存分為大小相等的兩塊。

  • 工作流程
    1. 使用其中一塊內存。
    2. 當內存耗盡,將存活對象復制到另一塊。
    3. 清理原內存塊。
  • 內存變化示例
    • 整理前:碎片化狀態。
    • 整理后:存活對象集中到另一塊,內存連續。
  • 內存區域類型
    • 可用內存、可回收內存、存活對象、保留內存。
2.2 標記-清除算法

最基礎算法,分“標記”和“清除”兩階段。

  • 工作流程
    • 標記存活對象(或需回收對象)。
    • 清除未標記對象。
  • 缺點
    • 效率問題:標記大量對象時性能低。
    • 空間問題:產生內存碎片(不連續空間)。
  • 內存變化示例
    • 整理前:碎片化狀態。
    • 整理后:碎片化更嚴重,僅區分可用內存、可回收內存、存活對象。
2.3 標記-整理算法

專為老年代設計,標記后移動對象以消除碎片。

  • 工作流程
    1. 標記存活對象。
    2. 將所有存活對象向一端移動。
    3. 清理邊界外內存。
  • 內存變化示例
    • 回收前:碎片化狀態。
    • 回收后:對象緊湊排列,區分存活對象、可回收內存、未使用內存。
3. 垃圾收集器實現

收集器是算法的具體實現,需根據場景選擇。無“萬能”收集器。

3.1 Serial收集器(-XX:+UseSerialGC, -XX:+UseSerialOldGC)
  • 特點
    • 單線程收集器,工作時暫停所有線程(Stop The World)。
    • 簡單高效(無線程交互開銷)。
  • 算法
    • 新生代:復制算法。
    • 老年代:標記-整理算法。
  • 適用場景:客戶端模式或小內存應用。
3.2 Parallel Scavenge收集器(-XX:+UseParallelGC, -XX:+UseParallelOldGC)
  • 特點
    • Serial的多線程版本(默認線程數 = CPU核數)。
    • 關注吞吐量(CPU運行用戶代碼時間占比)。
  • 算法
    • 新生代:復制算法。
    • 老年代:標記-整理算法。
  • Parallel Old收集器
    • Parallel Scavenge的老年代版本,多線程 + 標記-整理算法。
    • JDK8默認收集器,適合高吞吐場景。
3.3 ParNew收集器(-XX:+UseParNewGC)
  • 特點
    • 類似Parallel,但專為與CMS收集器配合設計。
    • 新生代使用復制算法。
  • 適用場景:Server模式下的首選(與CMS兼容)。
3.4 CMS收集器(-XX:+UseConcMarkSweepGC)
  • 特點
    • 并發收集器(最短停頓時間),用戶線程與GC線程并行。
    • 基于標記-清除算法。
  • 工作流程
    1. 初始標記(STW):標記GC Roots直接引用對象。
    2. 并發標記:遍歷對象圖(無停頓)。
    3. 重新標記(STW):修正并發標記變動(用增量更新算法)。
    4. 并發清理:清除未標記對象。
    5. 并發重置:重置標記數據。
  • 缺點
    • CPU敏感(與業務線程搶資源)。
    • 浮動垃圾(并發階段新垃圾需下次回收)。
    • 內存碎片(需定期整理)。
    • 不確定性(可能觸發Concurrent Mode Failure,降級為Serial Old)。
  • 關鍵參數
    -XX:+UseConcMarkSweepGC     # 啟用CMS  
    -XX:ConcGCThreads            # 并發GC線程數  
    -XX:+UseCMSCompactAtFullCollection  # FullGC后整理碎片  
    -XX:CMSFullGCsBeforeCompaction       # 多少次FullGC后整理一次(默認0)  
    -XX:CMSInitiatingOccupancyFraction   # 老年代使用比例觸發FullGC(默認92%)  
    -XX:+CMSScavengeBeforeRemark         # CMS前啟動Minor GC  
    
4. 億級流量電商系統JVM優化案例

針對訂單系統(8G內存,分配4G給JVM)。

  • 優化目標:減少Full GC(避免對象過早進入老年代)。
  • 參數配置
    -Xms3072M -Xmx3072M -Xmn2048M   # 堆大小(新生代2G)  
    -Xss1M                          # 線程棧大小  
    -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M  # 元空間  
    -XX:SurvivorRatio=8             # Eden與Survivor比例  
    -XX:MaxTenuringThreshold=5      # 對象年齡閾值(從15改為5)  
    -XX:PretenureSizeThreshold=1M   # 直接進入老年代對象大小閾值  
    -XX:+UseParNewGC -XX:+UseConcMarkSweepGC  # 新生代ParNew + 老年代CMS  
    -XX:CMSInitiatingOccupancyFraction=92     # 老年代92%觸發FullGC  
    -XX:+UseCMSCompactAtFullCollection        # FullGC后整理碎片  
    -XX:CMSFullGCsBeforeCompaction=3          # 每3次FullGC整理一次  
    
  • 優化原理
    • 增大新生代(-Xmn2048M),減少對象動態年齡判斷導致的過早晉升。
    • 降低對象年齡閾值(-XX:MaxTenuringThreshold=5),確保短期對象在Minor GC回收。
    • CMS默認參數適合高峰后Full GC(幾小時一次)。
5. 垃圾收集底層算法
5.1 三色標記算法

解決并發標記中的漏標問題,將對象分為三色:

  • 黑色:已掃描完(安全存活)。
  • 灰色:已掃描,但引用未全掃描。
  • 白色:未掃描(不可達對象)。
  • 問題與解決
    • 多標(浮動垃圾):并發階段局部變量銷毀導致本應回收的對象未被回收(下一輪GC處理)。
    • 漏標:通過讀寫屏障解決:
      • 增量更新(CMS使用):黑色對象插入新引用時記錄,重新掃描。
      • 原始快照(SATB, G1使用):灰色對象刪除引用時記錄,重新掃描。
  • 讀寫屏障實現
    // 寫屏障示例(增量更新)  
    void oop_field_store(oop* field, oop new_value) {pre_write_barrier(field);    // 寫前操作(記錄舊值)*field = new_value;post_write_barrier(field, new_value); // 寫后操作(記錄新值)
    }
    
5.2 記憶集與卡表

解決跨代引用問題(如新生代引用老年代)。

  • 記憶集(Remember Set):記錄跨代指針集合。
  • 卡表實現:字節數組(CARD_TABLE[]),每卡頁512字節。
    • 卡頁變臟(=1):有跨代指針時更新。
  • 維護:通過寫屏障自動更新卡表狀態。
6. 總結
  • 分代收集是JVM垃圾回收核心,新生代和老年代需匹配不同算法。
  • 收集器選擇需權衡吞吐量(Parallel Scavenge)和停頓時間(CMS)。
  • 優化案例顯示:合理配置新生代大小、對象年齡閾值及CMS參數可顯著減少Full GC。
  • 底層算法(三色標記、讀寫屏障)確保并發標記的正確性,避免漏標。

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

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

相關文章

全排列(回溯算法)

本文參考代碼隨想錄 給定一個 沒有重復 數字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 排列是有序的,在排列問題中不需要startIndex;但排列問題需要一個…

在線任意長度大整數計算器

具體請前往:在線大整數計算器--支持超大整數的加減乘除,冪運算/模運算,最大公約數,最小公倍數

AT6668B芯片說明書

這顆北斗專用單芯片解決方案AT6668B,采用射頻前端與基帶處理一體化設計,集成北斗二號/三號雙模B1IB1C信號處理器。通過優化星歷解碼算法實現秒級衛星鎖定,配合硬件加速的干擾監測模塊,在電磁環境復雜的應用場景中仍可維持10Hz高頻…

谷歌Chrome瀏覽器安裝插件

因為google瀏覽器的應用市場(https://chrome.google.com/webstore/category/extensions)在國內無法訪問,所以無法在線安裝插件,這里提供開發者模式離線安裝插件的方法。 1、下載crx腳本 谷歌瀏覽器的插件離線文件的擴展名為:crx(Firefox火狐瀏覽器的插件擴展名為fpi)。…

【制造】erp和mes系統建設方案(word)

第一部分 概述 第二部分 方案介紹 第三部分 系統業務流程 3.1 關鍵需求概括分析 3.1.1 銷售管理方面 3.1.2 采購管理方面 3.1.3 倉庫管理方面 3.1.4 財務管理方面 3.1.5 人力資源方面 3.2 關鍵需求具體分析 3.2.1 財務管理 3.2.1.1會計憑證解決 3.2.1.2鈔票流…

Spring AI 系列之二十八 - Spring AI Alibaba-基于Nacos的prompt模版

之前做個幾個大模型的應用,都是使用Python語言,后來有一個項目使用了Java,并使用了Spring AI框架。隨著Spring AI不斷地完善,最近它發布了1.0正式版,意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

IMAP電子郵件歸檔系統Mail-Archiver

簡介 什么是 Mail-Archiver ? Mail-Archiver 是一個用于從多個 IMAP 賬戶歸檔、搜索和導出電子郵件的 web 應用程序。它提供了一種全面的解決方案,幫助用戶管理和存儲電子郵件。 主要特點 📌自動歸檔:自動歸檔進出郵件&#xff…

李宏毅深度學習教程 第6-7章 自注意力機制 + Transformer

強烈推薦!臺大李宏毅自注意力機制和Transformer詳解!_嗶哩嗶哩_bilibili 目錄 1. 詞嵌入&問題情形 2. self-attention 自注意力機制 3. 自注意力的變形 3.1 多頭注意力(multi-head) 3.2 位置編碼 3.3 截斷自注意力&…

大模型幻覺的本質:深度=邏輯層次,寬度=組合限制,深度為n的神經網絡最多只能處理n層邏輯推理,寬度為w的網絡無法區分超過w+1個復雜對象的組合

大模型幻覺的本質:深度邏輯層次,寬度組合限制,深度為n的神經網絡最多只能處理n層邏輯推理,寬度為w的網絡無法區分超過w1個復雜對象的組合🧩 "深度邏輯層次"具體含義🔢 "寬度組合限制"具…

2419.按位與最大的最長子數組

Problem: 2419. 按位與最大的最長子數組 思路 子數組按位與的結果,不會超過子數組里的最大值(因為 a & b ≤ max(a, b))。 進一步推導,整個數組最大按位與的結果就是數組本身的最大值。 因為最大的那個元素自己作為子數組時&a…

智能時代:先管端點,再談效率

為什么需要統一端點管理?在混合辦公常態化、設備類型爆炸式增長的2025年,分散的端點如同散落各地的哨所。傳統管理方式讓IT團隊疲于應對系統更新、漏洞修復、權限分配等重復勞動,不僅消耗60%以上的運維時間,更可能因響應延遲導致安…

Windows字體simsum.ttf的安裝與Python路徑設置指南

下載工具: https://fontforge.org/en-US/downloads/windows-dl/ 使用工具: 復制到c:\windows\fonts路徑下面。 并復制到運行的python程序同一路徑下。比如:c:\pythoncode\new\

GitHub下載項目完整配置SSH步驟詳解

GitHub下載項目完整配置步驟(從零開始) 默認下好了git ,在文件夾中右鍵打開git bash , 如果沒有請在csdn搜索教程 第一步:檢查并清理現有SSH配置 # 進入.ssh目錄 cd ~/.ssh# 備份并刪除所有現有密鑰(避免沖…

數據結構(9)棧和隊列

1、棧 1.1 概念與結構 棧是一種特殊的線性表,只允許在固定的一端進行插入和刪除元素的操作。進行數據插入和刪除的一端稱為棧頂,另一端稱為棧底。棧里面的數據元素遵循后進先出的原則。棧的底層實現一般可以使用數組或者鏈表來實現,但數組的…

湖北大學暑期實訓優秀作品:面向美麗中國的數據化可視平臺

開發背景2024年1月11日,《中共中央國務院關于全面推進美麗中國建設的意見》發布,明確了建設美麗中國的總體要求、主要目標和重點任務,為我國生態文明建設提供了頂層設計和行動指南。系統簡介當前,中國正以空前的力度推進生態文明建…

Ubuntu系統VScode實現opencv(c++)隨機數與隨機顏色

在圖像處理與計算機圖形學中,隨機數與隨機顏色的生成常用于增強圖像的多樣性、可視化多個目標區域、模擬自然現象以及生成測試數據等任務。通過隨機化元素的顏色、位置或形狀,可以使程序在動態展示、調試輸出、以及數據增強等方面更加靈活和豐富。例如&a…

機器學習、深度學習與數據挖掘:三大技術領域的深度解析

基本概念與歷史沿革數據挖掘起源于20世紀90年代,是數據庫技術、統計學和機器學習交叉融合的產物。它經歷了從簡單查詢到復雜知識發現的演變過程,早期階段主要關注數據存儲和檢索,隨著IBM、微軟等公司的推動,逐漸形成了完整的知識發…

MoR vs MoE架構對比:更少參數、更快推理的大模型新選擇

Google DeepMind 近期發布了關于遞歸混合(Mixture of Recursion)架構的研究論文,這一新型 Transformers 架構變體在學術界和工業界引起了廣泛關注。該架構通過創新的設計理念,能夠在保持模型性能的前提下顯著降低推理延遲和模型規…

uniapp開發實現【中間放大兩邊縮小的輪播圖】

一、效果展示 二、代碼實現 <template><view><!-- 輪播圖 --><view class=<

機器學習沒有最好的模型,只有最合適的選擇(模型選擇)

機器學習領域存在"沒有免費午餐"定理&#xff0c;沒有任何一種模型在所有問題上都表現最優。不同模型有各自的優勢和適用場景。同一數據集上&#xff0c;不同模型的預測性能可能有巨大差異。例如&#xff0c;線性關系明顯的數據上線性模型可能表現優異&#xff0c;而…