本文将穿透式解析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 …