【JVMGC垃圾回收場景總結】

文章目錄

  • CMS在并發標記階段,已經被標記的對象,又被新生代跨帶引用,這時JVM會怎么處理?
  • 為什么 Minor GC 會發生 STW?
  • 有哪些對象是在棧上分配的?
  • 對象在 JVM 中的內存結構
  • 為什么需要對齊填充?
  • JVM 對象分配空間機制
  • JVM多線程并發分配對象如何解決堆搶占?
  • JVM容量分配實戰案例分析
  • JVM吞吐量和響應時間?

CMS在并發標記階段,已經被標記的對象,又被新生代跨帶引用,這時JVM會怎么處理?

CMS 垃圾回收器 中使用 “記憶集(Remembered Set)”+“寫屏障(Write Barrier)”機制 來解決并發標記期間 跨代引用變更 問題。

為什么需要“記憶集” + “寫屏障”?
在 CMS 的 并發標記階段:
GC 與應用線程并發執行;
這期間應用線程可能讓年輕代對象指向老年代對象;
但 CMS 默認只標記老年代;
年輕代未被掃描,容易 遺漏跨代引用;
所以必須 追蹤引用變更的位置 —— 這就是“寫屏障 + 記憶集”組合機制的作用。

寫屏障:屏障是一種插入到對象引用寫操作前后的特殊代碼邏輯,用來記錄引用的變化,在 CMS 里主要用于:

  1. 記錄跨代引用的變化(新生代指向老年代的引用);
  2. 追蹤老年代中對象引用的新增或變化,保證并發標記不遺漏
    什么是記憶集?
    記憶集是一種 記錄哪些區域可能包含跨代引用 的輔助數據結構。
    在 CMS 中使用的是:Card Table + Dirty Card Tracking

寫屏障的實現:

Card Table 工作機制:
老年代內存被劃分為很多小塊,每塊稱為一個 Card(比如 512 Bytes 一塊);
JVM 為每個 Card 維護一個字節標記(位于 Card Table 中);
這個字節初始值為 clean(0);
一旦寫屏障檢測到某個 Card 中的對象引用發生變化,就將對應字節標記為 dirty(1)。

記憶集:
記憶集的本質是一個輔助數據結構,用來記錄老年代對象中引用了新生代對象的“引用源地址”。
分代垃圾回收中,Minor GC 只掃描新生代,但可能有老年代對象引用了新生代;
為了避免掃描整個老年代,JVM用記憶集來記錄那些引用過新生代的老年代對象;
在 Minor GC 時,只需要掃描記憶集中的那部分老年代對象

為什么 Minor GC 會發生 STW?

  1. 避免對象引用混亂
    Eden 和 Survivor 區中的對象需要移動到 To 區或老年代;
    在對象“復制”過程中,如果程序繼續運行,會有引用被修改、丟失或讀取臟數據;
    所以,必須暫停所有線程,保證引用關系不變、對象移動安全。
  2. 根可達性分析需要一致的對象圖
    GC 需要做 可達性分析(Root Tracing),從 GC Roots 開始向下遍歷;
    如果線程在動,分析得到的對象圖會是錯誤的。

有哪些對象是在棧上分配的?

在 JVM 中,“對象在棧上分配” 并不是默認行為,而是一種通過逃逸分析(Escape Analysis)+ 棧上分配優化才有可能實現的高級性能優化機制。默認情況下,Java 中的所有對象都是在堆上分配的,只有局部變量的引用在棧幀中分配。
在棧上分配的條件:

  1. 對象不會逃逸出當前方法,也就是對象只在方法內被使用,不會被返回、不會賦給其他線程可訪問的變量。
  2. JVM 啟用了逃逸分析優化

棧上分配的優點:
3. 分配速度極快 棧是連續內存,分配只需移動指針(非常快);
4. 自動回收 隨方法調用結束,局部變量出棧即自動回收;
5. 不會觸發 GC 不在堆上,就不會進入 GC 管理范圍;
6. 減少內存碎片 不參與堆整理,降低 Full GC 頻率;
7. 標量替換優化可能性 JVM 可能將對象拆分為基本類型變量,進一步提升性能;

對象在 JVM 中的內存結構

  1. 對象頭(Header)
    包含兩部分信息:
    (1)Mark Word(標記字段) - 占 8 字節(32位JVM)或 12 字節(64位JVM 非壓縮指針)
    存儲內容因對象狀態而異,如:
    HashCode(如果調用過 hashCode())
    GC 分代年齡
    鎖信息(輕量級鎖、重量級鎖、偏向鎖)
    標記位(是否為偏向鎖/是否為垃圾對象等)
    (2)Class Pointer(類型指針) - 指向類的元數據
    指向方法區中該對象所屬類的 class 元信息,用于支持虛方法調用等。
  2. 實例數據(Instance Data)
    真正存放類的 字段(成員變量)值 的地方,包括:
    父類繼承下來的字段
    自身定義的字段
    按照 字段聲明順序、類型大小對齊 安排內存布局
  3. 對齊填充(Padding)
    為了滿足 8 字節對齊(HotSpot 默認對象起始地址對齊規則),可能會在對象末尾填充一些字節
    不參與邏輯數據存儲,只是內存對齊需要

為什么需要對齊填充?

  1. CPU 訪問效率
    CPU 訪問內存時,更快的訪問方式是**按固定字節邊界對齊(alignment)**訪問,比如 4 字節對齊、8 字節對齊。
    如果數據沒有對齊,CPU 需要分多次訪問內存才能讀取完整數據,導致性能下降。
    對齊保證數據起始地址是特定邊界的整數倍,能讓 CPU 一次性高效讀取。
  2. 硬件平臺的限制
    一些處理器架構要求特定類型數據必須對齊訪問,不對齊訪問會引發硬件異常(bus error),或者不得不做額外處理,降低性能。
    例如,64位系統一般要求 8 字節對齊,32位系統一般要求 4 字節對齊。
  3. 簡化內存地址計算
    對齊后,硬件和編譯器可以更簡單更快地計算內存地址和偏移,方便高效的指令執行。

JVM 對象分配空間機制

  1. 堆內存分配
    Java 對象主要在 **堆(Heap)**上分配。
    堆又分為 新生代(Young Gen)和 老年代(Old Gen)。
    新生代通常使用 Eden 區 + 兩個 Survivor 區。
  2. 對象分配流程
    新生代 Eden 區是對象分配的主要場所。
    JVM 默認采用 指針碰撞(Pointer Bump) 或 空閑列表(Free List) 分配策略:
    指針碰撞:Eden 是連續空間,有個指針指向下一分配位置,分配對象時指針往后移,速度快。
    空閑列表:如果 Eden 有碎片,可能采用空閑列表分配。
    大對象(如大數組、字符串)可能直接進入老年代,避免在新生代頻繁復制。
  3. 分配失敗與垃圾回收
    Eden 空間不足時觸發 Minor GC,回收無用對象。
    Minor GC 后仍空間不足時,可能觸發 Full GC 或對象晉升到老年代。

JVM多線程并發分配對象如何解決堆搶占?

  1. 多線程分配對象時,如果都操作同一內存區域,會產生同步開銷,降低性能。
  2. JVM 采用 線程本地分配緩存(TLAB,Thread Local Allocation Buffer) 來緩解:
    每個線程分配一個小的 Eden 子區域(TLAB)。
    線程先從自己 TLAB 分配,避免和其他線程競爭堆主區域鎖。
    只有當 TLAB 空了,才去堆中申請新的 TLAB。
  3. TLAB 分配流程示意
    線程啟動時,JVM 為它分配一個初始的 TLAB。
    分配新對象時,線程檢查 TLAB 剩余空間是否足夠。
    足夠,直接在 TLAB 內分配,調整指針。
    不足,從堆中申請新的 TLAB,再分配。
    對象生命周期結束后,垃圾回收釋放對象,回收空間。

JVM容量分配實戰案例分析

每天100w次登陸請求, 8G 內存該如何設置JVM參數,大概可以分為以下幾個步驟。

  1. 任何新的業務在上線之前我們都需要預估其占用的內存大小,而我們分配空間的大小主要來根據以下步驟來判斷?
  2. 計算業務系統每秒鐘創建的對象會占用多大的內存空間,然后計算集群下的每個系統每秒的內存占用空間(對象創建速度)
  3. 設置一個機器配置,估算新生代的空間,比較不同新生代大小之下,多久觸發一次MinorGC。
    為了避免頻繁GC,就可以重新估算需要多少機器配置,部署多少臺機器,給JVM多大內存空間,新生代多大空間。
  4. 根據這套配置,基本可以推算出整個系統的運行模型,每秒創建多少對象,1s以后成為垃圾,系統運行多久新生代會觸發一次GC,頻率多高。

具體的案例分析:
新增計費業務,預計每天1000萬次請求,高峰時期,每秒處理2000筆的并發,一共5臺機器內存大小8G,怎么算每臺機器分配多大內存能撐住并發?
1.每秒2000筆,分到每臺機器上的請求為400筆,加入每個請求所產生的對象大小為300字節,每個請求大概需要10個對象處理,我們暫估3KB,如果算上RPC和DB、寫庫、寫緩存一頓操作下來6KB的數據,每秒大概產生1~2M的數據,如果高峰期,我們分配的內存為6G,分配給新生代的大小,大概是2G,我們算出大概1000秒才會進行一次MinorGC。

JVM吞吐量和響應時間?

吞吐量是指程序用于處理業務的時間與總運行時間的比值。

吞吐量 = (總運行時間 - GC 時間) / 總運行時間

吞吐量越高,說明更多時間用于業務處理,GC 開銷更小。
高吞吐通常意味著:
較少 GC 次數
較長 GC 停頓時間
適合批處理、后臺計算任務。

響應時間是指系統對單個請求的響應速度,包括平均響應時間和最大響應時間(99%、99.9% 等分位)。
對交互式系統、低延遲系統(如支付系統、API 網關)非常關鍵。
低響應時間通常意味著:
更頻繁的 GC(避免長時間停頓)
GC 停頓更短
適合前臺服務、實時交互系統

堆內存大小 和GC 頻率和停頓時間之間的關系:
堆大 ? GC 少發生 ? 每次 GC 回收更多對象 ? 吞吐量大
但:每次 GC 停頓時間長 ? 阻塞線程多 ? 響應延遲上升
堆小 ? GC 更頻繁發生 ? 每次 GC 停頓短
但:每次處理對象少 ? 更頻繁打斷業務執行 ? 吞吐下降 ? CPU 被 GC 占用比例升高

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

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

相關文章

3_STM32開發板使用(STM32F103ZET6)

STM32開發板使用(STM32F103ZET6) 一、概述 當前所用開發板為正點原子精英板,MCU: STM32F103ZET6。一般而言,拿到板子之后先要對板子有基礎的認識,包括對開發板上電開機、固件下載、調試方法這三個部分有基本的掌握。 二、系統開機 2.1 硬件連接 直接接電源線或Type-c線…

crackme012

crackme012 名稱值軟件名稱attackiko.exe加殼方式無保護方式serial編譯語言Delphi v1.0調試環境win10 64位使用工具x32dbg,PEid破解日期2025-06-18 -發現是 16位windows 程序環境還沒搭好先留坑

CppCon 2016 學習:I Just Wanted a Random Integer

你想要一個隨機整數&#xff0c;用于模擬隨機大小的DNA讀取片段&#xff08;reads&#xff09;&#xff0c;希望覆蓋不同長度范圍&#xff0c;也能測試邊界情況。 代碼部分是&#xff1a; #include <cstdlib> auto r std::rand() % 100;它生成一個0到99之間的隨機整數&…

MySQL層級查詢實戰:無函數實現部門父路徑

本次需要擊斃的MySQL函數 函數主要用于獲取部門的完整層級路徑&#xff0c;方便在應用程序或SQL查詢中直接調用&#xff0c;快速獲得部門的上下級關系信息。執行該函數之后簡單使用SQL可以實現數據庫中部門名稱查詢。例如下面sql select name,GetDepartmentParentNames(du.de…

Python初學者教程:如何從文本中提取IP地址

Python初學者教程:如何從文本中提取IP地址 在網絡安全和數據分析領域,經常需要從文本文件中提取IP地址。本文將引導您使用Python創建一個簡單但實用的工具,用于從文本文件提取所有IP地址并將其保存到新文件中。即使您是編程新手,也可以跟隨本教程學習Python的基礎知識! …

【Redis】Redis核心探秘:數據類型的編碼實現與高速訪問之道

&#x1f4da;?前言 &#x1f31f;&#x1f31f;&#x1f31f;精彩導讀 本次我們將全面剖析Redis的核心技術要點&#xff0c;包括其豐富的數據類型體系、高效的編碼方式以及秒級響應的性能奧秘。對于渴望深入理解Redis底層機制的技術愛好者&#xff0c;這是一次難得的學習機會…

Halcon —— 多種二維碼檢測

工業視覺實戰&#xff1a;Halcon多類型二維碼識別技術詳解 在工業自動化場景中&#xff0c;兼容多種二維碼類型是提高生產線靈活性的關鍵。本文將深入解析Halcon實現Data Matrix、QR Code和PDF417三種主流二維碼的兼容識別方案&#xff0c;并重點解釋核心算子參數。 一、多類型…

安卓vscodeAI開發實例

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 目錄 一、安卓開發基礎與工具鏈革新 1.1 Android Studio的局限性分析 1.2 VSCode在移動開發中的崛起 1.3 跨平臺開發工具鏈對比…

③通用搜索---解析FastAdmin中的表格列表的功能

深度解析FastAdmin中的表格列表的功能-CSDN博客文章瀏覽閱讀25次。本文將FastAdmin框架的CRUD功能配置要點進行了系統梳理。官方文檔與開發經驗相結合&#xff0c;詳細介紹了菜單顯示、TAB過濾、通用搜索、工具欄按鈕、動態統計、快速搜索等17項功能的配置方法。包括字段渲染&a…

DeepSeek 助力 Vue3 開發:打造絲滑的日歷(Calendar),日歷_項目里程碑示例(CalendarView01_22)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

Python爬蟲實戰:獲取Diesel電商數據并分析

1. 引言 在當今數字化時代,電商平臺積累了海量的產品和用戶數據。通過對這些數據的挖掘和分析,企業可以深入了解市場動態、消費者需求和競爭態勢,從而制定更有效的營銷策略和產品規劃。Diesel 作為知名的時尚品牌,其在電商平臺上的表現備受關注。本研究旨在通過 Python 爬…

Spring RestTemplate + MultiValueMap vs OkHttp 多值參數的處理

&#x1f4cc; Spring RestTemplate vs OkHttp&#xff1a;多值參數處理 一、MultiValueMap 與 FormBody 的差異 特性RestTemplate MultiValueMapOkHttp FormBody多值參數支持? 原生支持&#xff08;add("key", "value") 自動追加&#xff09;? 需顯…

GelSight視觸覺3D輪廓儀賦能Beomni人形機器人觸覺遙測,開啟人形機器人觸覺應用新場景

在智能制造、航空航天等領域&#xff0c;傳統機器人常面臨操作精度不足、環境適應力弱等問題。GelSight觸覺傳感技術與Beomni人形機器人的融合&#xff0c;為這些場景提供了新可能 —— 通過亞微米級觸覺感知能力&#xff0c;操作員可遠程感知物體表面細節&#xff0c;在復雜環…

python設置word的字體顏色

這個錯誤是由于python-docx的RGBColor對象沒有.rgb屬性導致的。正確的屬性訪問方式是分別獲取紅、綠(g)、藍(b)三個分量。以下是修復方案&#xff1a; 錯誤原因分析 RGBColor對象的結構如下&#xff1a; from docx.shared import RGBColorcolor RGBColor(255, 204, 51) pri…

推薦模型之GBDT-LR

一、概念 GBDT-LR模型由FaceBook&#xff08;現在的Meta&#xff09;團隊于2014年在論文《Practial Lessons from Predicting Clicks on Ads at Facebook》中提出&#xff0c;目標是用于預測FaceBook的廣告點擊量&#xff08;實際上廣告和推薦領域很多算法模型都是共用的&#…

Java實現Excel圖片URL篩選與大小檢測

Java實現Excel圖片URL篩選與大小檢測 在數據處理場景中&#xff0c;我們常需篩選Excel中的圖片URL。本文分享一個完整的Java方案&#xff0c;涵蓋從讀取圖片URL到檢測有效性、篩選大小&#xff0c;再到生成新Excel文件的全過程&#xff0c;同時講解開發與優化過程&#xff0c;…

Java 實現后端調用 Chromium 瀏覽器無頭模式截圖的方案

Java 實現后端調用 Chromium 瀏覽器無頭模式截圖的方案 1. 使用 Playwright 優點&#xff1a;功能強大、支持多瀏覽器&#xff08;Chromium/Firefox/WebKit&#xff09;、支持異步操作。實現方式&#xff1a; 利用 Playwright 創建無頭瀏覽器實例&#xff1b;使用 Java 的調度…

基于多模態文檔解析與RAG的行業知識庫構建技術指南

1. 技術背景 隨著企業非結構化數據&#xff08;掃描件、PDF、圖像等&#xff09;占比超過80%&#xff0c;傳統關鍵詞檢索已無法滿足精準問答需求。本文提出融合**計算機視覺&#xff08;CV&#xff09;與大語言模型&#xff08;LLM&#xff09;**的解決方案&#xff0c;關鍵技…

基于YOLOv11+PP-OCRv5深度學習的智能車牌檢測與識別系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 智能車牌檢測與識別系統借助當下前沿的 YOLOv11 算法以及 PP-OCRv5 算法&#xff0c;能夠在復雜多樣的環境場景中&#xff0c;快速且精準地達成實時車牌檢測與識別任務。在現代交通管理領域&#xff0c;該技術意義重大&#xff0c;它能夠推動涉及車輛識別與記錄的…

[深度學習]全連接神經網絡

目錄 一、實驗目的 二、實驗環境 三、實驗內容 3.1 完成解壓數據集相關操作 3.2分析代碼結構并運行代碼查看結果 3.3修改超參數&#xff08;批量大小、學習率、Epoch&#xff09;并對比分析不同結果 3.4修改網絡結構&#xff08;隱藏層數、神經元個數&#xff09;并對比分…