每日面試題13:垃圾回收器什么時候STW?

STW是什么?——深入理解JVM垃圾回收中的"Stop-The-World"

在Java程序運行過程中,JVM會通過垃圾回收(GC)自動管理內存,釋放不再使用的對象以騰出空間。但你是否遇到過程序突然卡頓的情況?這可能與GC過程中的??Stop-The-World(STW,全局停頓)??有關。本文將圍繞"GC何時STW"展開,重點解析CMS與G1回收器的STW機制,并結合三色標記法說明其必要性。


一、STW的本質與核心作用

??Stop-The-World(STW)?? 是JVM在垃圾回收過程中,為保證內存回收的??正確性??和??一致性??,臨時暫停所有應用線程(User Thread)執行的現象。簡單來說,就是"世界停止了",只有GC線程在工作。

為什么需要STW?

垃圾回收的核心是??準確區分存活對象與可回收對象??。若應用線程在GC過程中繼續運行,可能導致:

  • ??對象狀態變更??:應用線程可能修改對象的引用關系(如創建新對象、銷毀舊對象、修改指針指向),導致GC標記結果失效;
  • ??數據不一致??:若GC線程與應用線程同時操作同一塊內存,可能引發競態條件(Race Condition),破壞內存管理的準確性。

因此,STW是GC保證自身邏輯正確的"保護機制",但過長或頻繁的STW會顯著降低程序性能(尤其是對延遲敏感的應用)。


二、三色標記法:GC標記對象的"通用語言"

無論是CMS還是G1,GC標記階段均基于??三色標記法??(Tri-Color Marking)實現。這是一種通過顏色標記對象存活狀態的并發標記算法,三種顏色含義如下:

顏色含義
白色未被GC線程訪問過的對象,默認視為"可回收垃圾"(未被標記)。
灰色已被GC線程訪問過,但其??引用的其他對象??尚未處理(待遍歷的"邊界"對象)。
黑色已被GC線程完整處理(自身標記為存活,且所有引用對象也已處理),確認"存活"。
標記過程的關鍵:

GC線程從GC Roots(如棧幀局部變量、靜態變量、JNI引用等)出發,將直接關聯的對象標記為灰色(初始階段);隨后遞歸處理灰色對象的引用,將其目標對象標記為灰色,自身升級為黑色(并發階段)。最終未被標記為黑色的白色對象將被回收。

但三色標記法存在一個天然缺陷:??若應用線程在標記過程中修改了對象的引用關系(如刪除灰色對象到白色對象的引用),可能導致白色對象被錯誤回收(漏標)??。因此,GC需要通過STW階段修正這些變動。


三、CMS回收器的STW階段解析

CMS(Concurrent Mark-Sweep,并發標記-清除)是早期的并發GC算法,目標是??減少STW時間??,適用于對延遲敏感的場景。其核心流程包含4個階段,其中??初始標記??和??重新標記??需要STW,其余階段與應用線程并發執行。

1. 初始標記(Initial Mark,STW)
  • ??目標??:快速標記GC Roots直接關聯的對象(即從GC Roots出發的第一層可達對象)。
  • ??STW原因??:需暫停所有應用線程,確保標記的準確性(避免應用線程在此時修改GC Roots的引用關系)。
  • ??耗時??:非常短暫(通常僅毫秒級),因為僅標記直接關聯對象。
2. 并發標記(Concurrent Mark,并發)
  • ??目標??:從初始標記的灰色對象出發,遞歸遍歷所有可達對象,將其標記為黑色(存活)。
  • ??STW狀態??:與應用線程并發執行(不暫停)。
  • ??風險??:若應用線程在并發標記期間修改了對象的引用關系(如刪除灰色對象到白色對象的引用),可能導致部分存活對象被漏標為白色。
3. 重新標記(Remark,STW)
  • ??目標??:修正并發標記階段因應用線程運行導致的標記變動(如漏標、錯標)。
  • ??STW原因??:需暫停應用線程,確保所有標記變動被正確處理(例如,通過"增量更新"算法記錄并發期間的引用變更,重新掃描這些變更的對象)。
  • ??耗時??:比初始標記長,但遠短于完全串行的標記過程(通常為初始標記的數倍)。
4. 并發清除(Concurrent Sweep,并發)
  • ??目標??:回收未被標記的白色對象(垃圾),釋放內存空間。
  • ??STW狀態??:與應用線程并發執行(不暫停)。
  • ??特點??:CMS采用"標記-清除"算法,因此不會移動存活對象,可能導致內存碎片(長期運行后可能引發Full GC)。
CMS的STW總結:

CMS通過并發標記和清除大幅減少了STW時間,但初始標記和重新標記仍需短暫停頓。其STW總耗時通常在10ms~100ms級別(取決于堆大小和對象復雜度)。


四、G1回收器的STW階段解析

G1(Garbage-First)是JDK9及以后默認的GC算法,設計目標是??平衡吞吐量與延遲??(支持設置最大停頓時間)。與CMS不同,G1將堆劃分為多個獨立的Region(默認2MB~32MB),并通過"標記-整理"思想優化內存布局。其核心流程同樣包含4個階段,但STW的觸發邏輯與CMS有顯著差異。

1. 初始標記(Initial Mark,STW)
  • ??目標??:標記GC Roots直接關聯的對象,并記錄每個Region中"已存活對象"的數量(用于后續回收價值排序)。
  • ??STW狀態??:與應用線程并發執行(僅標記GC Roots直接關聯的對象,耗時極短)。
  • ??特點??:G1的初始標記通常與Minor GC(年輕代GC)合并執行,進一步減少STW時間。
2. 并發標記(Concurrent Mark,并發)
  • ??目標??:遞歸標記所有可達對象,統計每個Region的存活對象比例。
  • ??STW狀態??:與應用線程并發執行(不暫停)。
  • ??優化??:G1通過"SATB(Snapshot-At-The-Beginning)"算法記錄初始標記時的對象快照,即使后續應用線程修改引用關系,也能通過對比快照修正標記(減少漏標)。
3. 最終標記(Final Mark,STW)
  • ??目標??:處理并發標記階段SATB快照中未被處理的變動(如新增的白色對象),確保標記結果最終準確。
  • ??STW狀態??:與應用線程短暫并發(僅掃描SATB隊列中的變更,耗時通常在1ms~5ms)。
4. 篩選回收(Live Data Counting and Evacuation,STW)
  • ??目標??:根據各Region的存活對象比例和回收價值(存活對象越少、Region越小,回收價值越高),選擇部分Region進行回收,并將存活對象移動到其他Region(整理內存)。
  • ??STW原因??:需暫停應用線程,確保存活對象移動過程的原子性(避免應用線程訪問正在移動的對象)。
  • ??耗時??:取決于需要回收的Region數量(若僅回收少量Region,STW可控制在10ms以內)。
G1的STW總結:

G1的STW主要集中在初始標記、最終標記和篩選回收階段,但通過并發標記和SATB算法大幅縮短了單次STW的時間。由于G1支持"增量回收"(每次只回收部分Region),其平均STW時間可控制在用戶設定的閾值內(如不超過200ms)。


五、CMS與G1的STW對比

維度CMSG1
??STW階段??初始標記、重新標記初始標記、最終標記、篩選回收
??單次STW時長??較長(重新標記可能達百毫秒級)更短(篩選回收可通過Region選擇優化)
??內存碎片??標記-清除算法導致碎片積累標記-整理算法避免碎片
??適用場景??老年代小堆(<8GB),對延遲敏感大堆(>8GB),需平衡吞吐量與延遲

總結

STW是GC保證正確性的必要代價,但通過優化標記算法(如三色標記+SATB)和并發設計(如CMS的并發標記、G1的Region劃分),現代GC已將STW時間控制在可接受范圍內。理解不同回收器的STW階段,有助于我們在實際開發中根據業務需求(如延遲敏感型或吞吐量優先型)選擇合適的GC算法,并通過JVM參數調優(如-XX:+UseConcMarkSweepGC-XX:+UseG1GC)進一步降低停頓時間。

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

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

相關文章

【系統全面】常用SQL語句大全

一、基本查詢語句 查詢所有數據&#xff1a; SELECT * FROM 表名;查詢特定列&#xff1a; SELECT 列名1, 列名2 FROM 表名;條件查詢&#xff1a; SELECT * FROM 表名 WHERE 條件;模糊查詢&#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE 模式%;排序查詢&#xff1a; SELECT *…

Spring之SSM整合流程詳解(Spring+SpringMVC+MyBatis)

Spring之SSM整合流程詳解-SpringSpringMVCMyBatis一、SSM整合的核心思路二、環境準備與依賴配置2.1 開發環境2.2 Maven依賴&#xff08;pom.xml&#xff09;三、整合配置文件&#xff08;核心步驟&#xff09;3.1 數據庫配置&#xff08;db.properties&#xff09;3.2 Spring核…

C++STL系列之set和map系列

前言 set和map都是關聯式容器&#xff0c;stl中樹形結構的有四種&#xff0c;set&#xff0c;map&#xff0c;multiset,multimap.本次主要是講他們的模擬實現和用法。 一、set、map、multiset、multimap set set的中文意思是集合&#xff0c;集合就說明不允許重復的元素 1……

Linux 磁盤掛載,查看uuid

lsblk -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINT,SIZEsudo ntfsfix /dev/nvme1n1p1sudo mount -o remount,rw /dev/nvme1n1p1 /media/yake/Datasudo ntfsfix /dev/sda2sudo mount -o remount,rw /dev/sda2 /media/yake/MyData

【AJAX】XMLHttpRequest、Promise 與 axios的關系

目錄 一、AJAX原理 —— XMLHttpRequest 1.1 使用XMLHttpRequest 二、 XMLHttpRequest - 查詢參數 &#xff08;就是往服務器后面拼接要查詢的字符串&#xff09; 三、 地區查詢 四、 XMLHttpRequest - 數據提交 五、 認識Promise 5.1 為什么 JavaScript 需要異步&#…

C++中的stack和queue

C中的stack和queue 前言 這一節的內容對于stack和queue的使用介紹會比較少&#xff0c;主要是因為stack和queue的使用十分簡單&#xff0c;而且他們的功能主要也是在做題的時候才會顯現。這一欄目暫時不會寫關于做題的內容&#xff0c;后續我會額外開一個做題日記的欄目的。 這…

Spring Bean生命周期七步曲:定義、實例化、初始化、使用、銷毀

各位小猿&#xff0c;程序員小猿開發筆記&#xff0c;希望大家共同進步。 引言 1.整體流程圖 2.各階段分析 1??定義階段 1.1 定位資源 Spring 掃描 Component、Service、Controller 等注解的類或解析 XML/Java Config 中的 Bean 定義 1.2定義 BeanDefinition 解析類信息…

API安全監測工具:數字經濟的免疫哨兵

&#x1f4a5; 企業的三重致命威脅 1. 漏洞潛伏的定時炸彈 某支付平臺未檢測出API的批量數據泄露漏洞&#xff0c;導致230萬用戶信息被盜&#xff0c;面臨GDPR 1.8億歐元罰單&#xff08;IBM X-Force 2024報告&#xff09;。傳統掃描器對邏輯漏洞漏檢率超40%&#xff08;OWASP基…

Matplotlib詳細教程(基礎介紹,參數調整,繪圖教程)

目錄 一、初識Matploblib 1.1 安裝 Matplotlib 1.2、Matplotlib 的兩種接口風格 1.3、Figure 和 Axes 的深度理解 1.4 設置畫布大小 1.5 設置網格線 1.6 設置坐標軸 1.7 設置刻度和標簽 1.8 添加圖例和標題 1.9 設置中文顯示 1.10 調整子圖布局 二、常用繪圖教程 2…

Redis高可用架構演進面試筆記

1. 主從復制架構 核心概念Redis單節點并發能力有限&#xff0c;通過主從集群實現讀寫分離提升性能&#xff1a; Master節點&#xff1a;負責寫操作Slave節點&#xff1a;負責讀操作&#xff0c;從主節點同步數據 主從同步流程 全量同步&#xff08;首次同步&#xff09;建立連接…

無人機保養指南

定期清潔無人機在使用后容易積累灰塵、沙礫等雜物&#xff0c;需及時清潔。使用軟毛刷或壓縮空氣清除電機、螺旋槳和機身縫隙中的雜質。避免使用濕布直接擦拭電子元件&#xff0c;防止短路。電池維護鋰電池是無人機的核心部件&#xff0c;需避免過度放電或充電。長期存放時應保…

vlm MiniCPM 學習部署實戰

目錄 開源地址&#xff1a; 模型repo下載&#xff1a; 單圖片demo&#xff1a; 多圖推理demo&#xff1a; 論文學習筆記&#xff1a; 部署完整教程&#xff1a; 微調教程&#xff1a; 部署&#xff0c;微調教程&#xff0c;視頻實測 BitCPM4 技術報告 創意&#xff1…

92套畢業相冊PPT模版

致青春某大學同學聚會PPT模版&#xff0c;那些年我們一起走過的歲月PPT模版&#xff0c;某學院某班同學聯誼會PPT模版&#xff0c;匆匆那年PPT模版&#xff0c;青春的紀念冊PPT模版&#xff0c;梔子花開PPT模版&#xff0c;畢業紀念冊PPT模版。 92套畢業相冊PPT模版&#xff1…

爬蟲基礎概念

網絡爬蟲概述 概念 網絡爬蟲&#xff08;Web Crawler&#xff09;&#xff0c;也稱為網絡蜘蛛&#xff08;Web Spider&#xff09;或機器人&#xff08;Bot&#xff09;&#xff0c;是一種自動化程序&#xff0c;用于系統地瀏覽互聯網并收集網頁信息。它模擬人類瀏覽器行為&…

java8 stream流操作的flatMap

我們來詳細解釋一下 Java 8 Stream API 中的 flatMap 操作。理解 flatMap 的關鍵在于將其與 map 操作進行對比。??核心概念&#xff1a;????map 操作&#xff1a;??作用&#xff1a;將一個流中的每個元素??轉換??為另一個元素&#xff08;類型可以不同&#xff09;…

開源UI生態掘金:從Ant Design二次開發到行業專屬組件的技術變現

開源UI生態掘金&#xff1a;從Ant Design二次開發到行業專屬組件的技術變現內容摘要在開源UI生態中&#xff0c;Ant Design作為一款廣受歡迎的UI框架&#xff0c;為開發者提供了強大的基礎組件。然而&#xff0c;面對不同行業的特定需求&#xff0c;僅僅依靠現有的組件往往難以…

Object Sense (OSE):一款從編輯器腳本發展起來的編程語言

引言&#xff1a;從Vim編輯器走出的語言在編程語言的世界里&#xff0c;許多革命性的創新往往源于看似簡單的工具。Object Sense&#xff08;簡稱OSE&#xff09;的誕生&#xff0c;便與一款經典文本編輯器——Vim息息相關。它的前身是Vim的腳本語言VimL&#xff08;Vimscript&…

我考PostgreSQL中級專家證書二三事

1. 為什么選擇PGCE&#xff1f;PostgreSQL的開源特性、高性能和高擴展性早已讓我心生向往&#xff0c;而PGCE認證不僅是對技術能力的認可&#xff0c;更是一張通往更高職業舞臺的“通行證”。官方資料提到&#xff0c;PGCE考試涵蓋性能優化、高可用架構、復雜查詢處理、內核原理…

Java 動態導出 Word 登記表:多人員、分頁、動態表格的最佳實踐

本文詳細講解如何使用 Java 動態導出包含多人員報名表的 Word 文檔&#xff0c;每人占據獨立一頁&#xff0c;并支持動態表格行&#xff08;如個人經歷&#xff09;。我們對比了多種實現方案&#xff0c;最終推薦基于 Freemarker XML 模板 或 docx4j 的靈活方式&#xff0c;并…

【element-ui el-table】多選表格勾選時默認勾選了全部,row-key綁定異常問題解決

項目場景&#xff1a; Element-UI的el-table組件row-key使用問題 同一個頁面使用了幾個table&#xff0c;這幾個table都使用了多選&#xff0c;row-key屬性&#xff0c;其中row-key的綁定方式都是用的靜態綁定&#xff0c;row-key“username”或row-key“id”&#xff0c;可正常…