JVM(2)——垃圾回收算法

本文將穿透式解析JVM垃圾回收核心算法,涵蓋7大基礎算法+4大現代GC實現+3種內存分配策略,通過15張動態示意圖+GC日志實戰分析,帶您徹底掌握JVM內存自動管理機制。

一、GC核心概念體系

1.1 對象存亡判定法則

引用計數法致命缺陷

// 循環引用導致內存泄漏
class Node {Node next;public static void main(String[] args) {Node a = new Node();Node b = new Node();a.next = b;  // a引用計數=1b.next = a;  // b引用計數=1a = null;   // a引用計數=1(b.next仍引用)b = null;   // b引用計數=1(a.next仍引用)// 兩個對象永遠無法回收!}
}

1.2 對象引用強度分級

引用類型特點回收條件典型應用
強引用Object obj = new Object()永不回收普通對象
軟引用SoftReference<T>內存不足時回收緩存系統
弱引用WeakReference<T>下次GC必回收WeakHashMap
虛引用PhantomReference<T>對象回收跟蹤DirectByteBuffer清理

二、基礎垃圾回收算法詳解

2.1 標記-清除(Mark-Sweep)

執行流程

  1. 標記階段:遍歷GC Roots標記存活對象

  2. 清除階段:回收未標記對象內存

內存布局變化

初始狀態: [A][B][C][D]  # 4個對象
標記后:   [A*][B][C*][D]  # *表示存活
清除后:   [A][ ][C][ ]  # 產生內存碎片

致命缺陷

  • 內存碎片化:導致大對象分配失敗

  • 執行效率低:兩次堆遍歷(O(n)復雜度)

2.2 復制算法(Copying)

內存劃分

Eden: [  新生對象分配區  ]
Survivor0: [ 存活區 ]
Survivor1: [ 存活區 ]

執行過程

HotSpot實現細節

  • 默認比例:Eden:Survivor?= 8:1:1

  • 對象年齡計數器:-XX:MaxTenuringThreshold=15

  • 分配擔保機制:-XX:HandlePromotionFailure

2.3 標記-整理(Mark-Compact)

執行步驟

  1. 標記存活對象(同標記-清除)

  2. 所有存活對象向內存一端移動

  3. 清理邊界外內存

內存布局變化

標記前: [A][ ][B][C][ ][D]
標記后: [A*][ ][B*][C*][ ][D*]
整理后: [A][B][C][D][ ][ ]  # 消除碎片

優勢:避免內存碎片
代價:移動對象需更新引用(STW時間更長)

2.4 分代收集理論

核心假設

  • 弱分代假說:絕大多數對象朝生夕死

  • 強分代假說:熬過多次GC的對象更難消亡

  • 跨代引用假說:跨代引用是極少數

分代布局

三、現代GC算法實現

3.1 CMS(Concurrent Mark Sweep)

四階段執行流程

致命缺陷

  1. 內存碎片:使用標記-清除算法

    # 解決方案:開啟內存整理
    -XX:+UseCMSCompactAtFullCollection

  2. 并發模式失敗:老年代空間不足

    # 調優參數
    -XX:CMSInitiatingOccupancyFraction=70  # 老年代70%時觸發
    -XX:+UseCMSInitiatingOccupancyOnly

  3. 浮動垃圾:并發清理階段新產生的垃圾

3.2 G1(Garbage-First)

革命性設計

核心流程

調優關鍵參數

-XX:G1HeapRegionSize=4m  # Region大小
-XX:MaxGCPauseMillis=200 # 目標暫停時間
-XX:InitiatingHeapOccupancyPercent=45 # 觸發并發標記的堆使用率

3.3 ZGC(Z Garbage Collector)

三大黑科技

  1. 染色指針(Colored Pointers)

    // 64位指針結構
    | 18位保留 | 1位Finalizable | 1位Remap | 1位Marked1 | 1位Marked0 | 42位地址 |

  2. 內存多重映射

    # 不同視圖映射同一物理內存
    $ cat /proc/<pid>/maps | grep heap

  3. 并發對象轉移

    // 對象移動時通過指針自愈機制更新引用

執行階段

3.4 Shenandoah GC

創新點

  • Brooks指針:每個對象頭含轉發指針

    struct Object {void* forward_ptr;  // 指向新位置// ...其他字段
    }

  • 并發壓縮算法:無需STW完成堆壓縮

性能對比

GC名稱最大暫停時間吞吐量損失JDK支持
CMS100-500ms10-20%≤JDK14
G150-200ms<15%≥JDK9
ZGC<1ms<15%≥JDK15
Shenandoah<1ms<10%OpenJDK

四、GC算法實戰分析

4.1 內存分配策略

對象優先Eden分配

// -XX:+PrintGCDetails 日志
public class Allocation {private static final int _1MB = 1024 * 1024;public static void main(String[] args) {byte[] a1 = new byte[2 * _1MB];  // 分配在Edenbyte[] a2 = new byte[2 * _1MB];  // 分配在Edenbyte[] a3 = new byte[2 * _1MB];  // 觸發Minor GC}
}

大對象直接進老年代

-XX:PretenureSizeThreshold=3145728  # 3MB以上對象直接進老年代

長期存活對象晉升

// -XX:MaxTenuringThreshold=1
public class TenuringThreshold {public static void main(String[] args) {byte[] a1 = new byte[_1MB / 4];byte[] a2 = new byte[4 * _1MB];byte[] a3 = new byte[4 * _1MB];  // 觸發Minor GCa3 = null;a3 = new byte[4 * _1MB];  // 再次觸發Minor GC}
}

4.2 GC日志深度解讀

CMS日志分析

[GC (Allocation Failure) [ParNew: 367616K->40960K(367616K), 0.0468480 secs]-> 新生代回收,暫停46ms
[GC (CMS Initial Mark) [1 CMS-initial-mark: 524289K(786432K)] -> 初始標記階段
[CMS-concurrent-mark: 1.234/1.543 secs] -> 并發標記耗時1.543秒
[GC (CMS Final Remark) [YG occupancy: 275342 K (367616 K)]-> 重新標記階段
[CMS-concurrent-sweep: 0.876/0.987 secs]-> 并發清除耗時0.987秒

G1日志關鍵指標

[GC pause (G1 Evacuation Pause) (young), 0.0234159 secs][Parallel Time: 22.3 ms][Ext Root Scanning: 3.5 ms][Update RS: 0.2 ms][Processed Buffers: 43][Scan RS: 1.8 ms][Code Root Scanning: 0.7 ms][Object Copy: 15.1 ms]  # 對象復制耗時[Eden: 2048.0M(2048.0M)->0.0B(2048.0M) Survivors: 0.0B->102.0M Heap: 4096.0M(8192.0M)->2054.0M(8192.0M)] 

五、高級調優技巧

5.1 避免Full GC的黃金法則

  1. 老年代空間擔保

    -XX:-HandlePromotionFailure  # JDK6后已失效

  2. 元空間監控

    jstat -gcmetacapacity <pid>  # 查看元空間使用

  3. 堆外內存控制

    -XX:MaxDirectMemorySize=128m

5.2 GC選擇策略矩陣

應用場景推薦GC參數配置
小型應用Serial-XX:+UseSerialGC
響應優先Web服務G1-XX:+UseG1GC -MaxGCPauseMillis=100
大內存服務ZGC/Shenandoah-XX:+UseZGC -Xmx32g
低延遲交易系統ZGC-XX:+UseZGC -XX:SoftMaxHeapSize=4g

六、常見生產問題解決方案

6.1 頻繁Full GC排查

診斷步驟

  1. jstat -gcutil <pid> 1000?觀察內存趨勢

  2. jmap -histo:live <pid>?查看對象直方圖

  3. jmap -dump:format=b,file=heap.bin <pid>?導出堆轉儲

  4. MAT分析支配樹查找泄漏點

6.2 GC調優實戰案例

場景:電商大促期間每2小時Full GC
分析:監控顯示老年代每次GC后剩余空間不足10%
解決方案

# 原配置
-Xms8g -Xmx8g -XX:NewRatio=2# 優化后
-Xms12g -Xmx12g 
-XX:NewRatio=1        # 增大新生代
-XX:SurvivorRatio=6   # 增大Eden
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150

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

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

相關文章

基于Spring Boot+Vue的“暖寓”宿舍管理系統設計與實現(源碼及文檔)

基于Spring BootVue的“暖寓”宿舍管理系統設計與實現 第 1 章 緒論 1.1 論文研究主要內容 1.1.1 系統概述 1.1.2 系統介紹 1.2 國內外研究現狀 第 2 章 關鍵技術介紹 2.1 關鍵性開發技術的介紹 2.1.1 Java簡介 2.1.2 Spring Boot框架 2.2 其他相關技術 2.2.1 Vue.J…

基于Java的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成實戰

目錄 前言 一、需求介紹 1、指定寬度生成 2、指定列自適應生成 二、Java生成實現 1、公共方法 2、指定寬度生成 3、指定列自適應生成 三、總結 前言 在當今數字化與信息化飛速發展的時代&#xff0c;圖像的生成與處理技術正日益成為眾多領域關注的焦點。從創意設計到數…

軟考 系統架構設計師系列知識點之雜項集萃(93)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;92&#xff09; 第169題 人工智能技術已成為當前國際科技競爭的核心技術之一&#xff0c;AI芯片是占據人工智能市場的法寶。AI芯片有別于通常處理器芯片&#xff0c;它應具備四種關鍵特征。&…

Kotlin實現文件下載斷點續傳(RandomAccessFile全解析)

本文將深入探討如何使用Kotlin和RandomAccessFile實現高效的斷點續傳功能&#xff0c;涵蓋原理分析、完整代碼實現、性能優化及工程實踐要點。 一、斷點續傳核心原理 1.1 HTTP斷點續傳協議 #mermaid-svg-EfmgPUx3SFkso8Fc {font-family:"trebuchet ms",verdana,aria…

linux-headers-$(uname -r)和kmod是什么?

2025年6月16日&#xff0c;周一清晨 Linux-headers-$(uname -r)與kmod包詳解 一、linux-headers-$(uname -r)包 linux-headers-(uname -r)是Linux系統中與當前運行內核版本匹配的內核頭文件包&#xff0c;其中(uname -r)會自動替換為當前內核版本號&#xff08;如5.13.0-19-g…

使用axios及和spirng boot 交互

Axios Axios是一個基于Promise的HTTP庫&#xff0c;可以發送get、post等請求&#xff0c;它作用于瀏覽器和Node.js中。當運行在瀏覽器時&#xff0c;使用XMLHttpRequest接口發送請求&#xff1b;當運行在Node.js時&#xff0c;使用HTTP對象發送請求。 使用步驟&#xff1a; 第…

布局文件的逐行詳細解讀

總覽 源碼 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto&…

VTK 顯示大量點云數據及交互(點云拾取、著色、測量等)功能

VTK (Visualization Toolkit) 是一個強大的開源可視化庫&#xff0c;非常適合處理點云數據。下面將介紹如何使用 VTK 顯示大量點云數據&#xff0c;并實現點云拾取、著色、測量等功能。 基本點云顯示 創建一個基本的點云顯示程序&#xff1a; cpp #include <vtkSmartPoi…

性能優化 - 高級進階: 性能優化全方位總結

文章目錄 Pre1. 概述&#xff1a;性能優化提綱與使用場景2. 準備階段2.1 明確優化范圍與目標2.2 環境與工具準備 3. 數據收集與指標確認3.1 關鍵資源維度與指標項3.2 監控體系搭建與初始采集3.3 日志與追蹤配置 4. 問題定位思路4.1 從整體到局部的分析流程4.2 常見瓶頸維度檢查…

Mybatis之Integer類型字段為0,入庫為null

背景&#xff1a; 由于項目某個功能用到優先級字段來判斷&#xff0c;需要在mysql表中定義一個字段XX&#xff0c;類型為int&#xff0c;默認為0&#xff0c;具體值由后臺配置&#xff0c;正常入庫即可 問題&#xff1a; 由于后臺配置存量其他類型的數據無需該字段&#xff0c…

上海市計算機學會競賽平臺2022年3月月賽丙組洗牌

題目描述 給定一個整數 nn&#xff0c;表示 nn 張牌&#xff0c;牌的編號為 11 到 nn。 再給定一個洗牌置換 f1,f2,…,fnf1?,f2?,…,fn?&#xff0c;進行一次洗牌操作時&#xff0c;應將第一號位置的牌交換到第 f1f1? 號位置&#xff0c;將第 ii 號位置的牌交換到第 fifi…

DINO-R1:激勵推理能力的視覺基礎模型

摘要 近期&#xff0c;人們對大型語言模型&#xff08;如DeepSeek-R1&#xff09;推理能力的關注呈爆炸式增長&#xff0c;通過基于強化學習的微調框架&#xff08;如組相對策略優化&#xff08;Group Relative Policy Optimization&#xff0c;GRPO&#xff09;方法&#xff…

Linux--LVM邏輯卷擴容

Linux–LVM邏輯卷擴容 文章目錄 Linux--LVM邏輯卷擴容?? LVM 常用命令分類及基本格式? 1. 物理卷(PV)相關命令? 2. 卷組(VG)相關命令? 3. 邏輯卷(LV)相關命令?? 三、查看類命令簡寫說明使用命令及基本格式:lvm邏輯卷擴容步驟:1.添加硬盤設備2.檢測新增硬盤 添加…

C#基礎語法與控制臺操作

1. 控制臺操作基礎 控制臺程序是學習C#的起點。以下是一些常用的控制臺操作方法&#xff1a; 1.1. 清除控制臺 Console.Clear(); // 清除控制臺內容1.2. 輸出字符串 Console.WriteLine("Hello World!"); // 在屏幕的當前位置換行輸出字符串 Console.Write("…

100.Complex[]同時儲存實數和虛數兩組double的數組 C#例子

在信號處理中&#xff0c;IQ 數據&#xff08;In-phase and Quadrature&#xff09;通常表示復數形式的信號&#xff0c;其中實部表示同相分量&#xff0c;虛部表示正交分量。Complex[] data 是一個包含 IQ 數據的數組&#xff0c;每個元素是一個復數&#xff0c;表示一個信號樣…

停止追逐 React 重渲染

大多數開發者都在浪費時間對抗多余的重渲染。真正的 React 架構師根本讓問題無從產生——下面就來揭開他們的思路&#xff0c;以及為何大多數所謂的性能優化技巧反而拖慢了你的應用。 重渲染的無盡輪回 先來直擊痛點&#xff1a;如果還在項目里到處撒 useMemo、useCallback&…

流水線的安全與合規 - 構建可信的交付鏈

流水線的安全與合規 - 構建可信的交付鏈 “安全左移 (Shift-Left Security)”的理念 “安全左移”是 DevSecOps 的核心理念,指的是將安全測試和考量,從軟件開發生命周期 (SDLC) 的末端(發布前),盡可能地向左移動到更早的階段(如編碼、構建、測試階段)。 為何對 SRE 至…

???????神經網絡基礎講解 一

??一.神經網絡 ? ??1. 全連接神經網絡&#xff08;Fully Connected Network, FCN&#xff09;?? ??核心概念&#xff1a;?? ??輸入層??&#xff1a;接收原始數據&#xff08;如數字、圖片像素等&#xff09; 數字矩陣 。??隱藏層??&#xff1a;對數據…

MySQL 8.0 OCP 英文題庫解析(二十二)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題201~210 試題2…

【大模型推理】PD分離場景下decoder負載均衡,如何選取decoder

https://mp.weixin.qq.com/s?__bizMzg4NTczNzg2OA&mid2247507420&idx1&sn4b32726abd205c7f94144bcb9105330f&chksmce64b9fc7f1d8de04a40b0153302dee52262c6f104c67195e2586e75c8093b8be493f252c8a3#rd 在非 Local 場景下&#xff0c;Prefill 定時獲取 Decode …