垃圾回收算法(Garbage Collection)深度解析

news2025/3/28 4:11:12

垃圾回收算法(Garbage Collection)深度解析

核心思想

  • 垃圾回收核心目标:
    • 定位存活对象 、回收死亡对象
    • 可达性分析算法、空间复用优化

生死判定原理

  • 可达性分析法(Reachability Analysis)
    通过GC Roots(栈变量、静态变量、JNI引用等)构建引用链,未连接的对象视为垃圾

算法评价三维度

指标定义关键影响因素
吞吐量用户代码执行时间占比GC频率、单次GC耗时
最大暂停时间单次STW最长持续时间内存整理算法选择、堆大小
堆使用效率有效内存空间占比算法内存管理机制(碎片化程度)

黄金三角定律:三者无法同时最优,需根据场景权衡
(缓存系统追求高吞吐、实时系统优先低延迟、嵌入式设备需高内存效率)


经典算法矩阵

1. 标记-清除(Mark-Sweep)

算法流程

标记阶段 清除阶段 从GC Roots遍历标记 传递标记位图 线性扫描清理未标记区域 标记阶段 清除阶段

优势:

  • 内存利用率100%(不预留空间)
  • 无对象迁移开销

缺陷:

  • 内存碎片化(外部碎片)
  • 双指针遍历内存的低效性
  • "致命50%"现象(整体复制性能更好)

2. 复制算法(Copying)

半区复制原理

// 伪代码示例
void collecting() {
    for (LiveObject obj : fromSpace) {
        copyTo(obj, toSpace);   // 复制存活对象
        forwardPtr(obj);        // 更新引用指针
    }
    swap(fromSpace, toSpace);   // 空间角色互换
}

优势:

  • 消除内存碎片
  • 顺序分配的高效性(指针碰撞)
  • 年轻代最佳选择(存活率<10%时高效)

缺陷:

  • 内存利用率仅50%
  • 不适合大对象场景

3. 标记Credit整理(Mark-Compact)

三步机制

  1. 标记存活对象
  2. 计算对象迁移地址
  3. 滑动式整理(Sliding Compaction)

优势:

  • 100%内存利用率
  • 消除碎片问题

缺陷:

  • 三次堆遍历的高时间成本
  • 老年代整理的默认选择

分代式GC(Generational GC)

设计哲学

弱分代假说:绝大多数对象朝生夕灭
强分代假说:经历多次GC的对象更长寿

内存布局

33% 67% 堆内存分配比例 新生代(Young) 老年代(Old)
新生代细节:
  • 划分结构:Eden + Survivor*2(8:1:1)
  • 回收机制
    • Minor GC触发条件:Eden区满
    • 对象晋升阈值:-XX:MaxTenuringThreshold(默认15)
    • HotSpot实现:Parallel Scavenge(复制算法)
老年代管理:
  • Major GC触发条件:老年代空间不足
  • 算法实现
    • CMS(Mark-Sweep)
    • G1(局部复制+全局整理)

现代GC技术演进

  1. 增量式GC:允许GC与用户线程交替执行
  2. 并发标记:CMS/G1的并发标记阶段
  3. Region分区:G1/ZGC的内存管理单元
  4. 颜色指针:ZGC的元数据存储方案
  5. 读屏障:Shenandoah的并发处理技术

算法性能对比表

算法时间效率空间效率碎片率适用场景
标记-清除老年代(CMS)
复制算法新生代
标记-整理老年代(Serial)
分代GC极高混合全堆管理

性能调优启示

  1. 新生代大小设置 → 在STW时间与GC频率间找平衡
    -Xmn参数建议:老年代存活对象总量的1~1.5倍

  2. 空间分配担保机制:
    JDK6之后HandlePromotionFailure策略优化

  3. 大对象直接分配老年代:
    -XX:PretenureSizeThreshold参数控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ的高级特性介绍(一)

消息确认机制 ⽣产者发送消息之后, 到达消费端之后, 可能会有以下情况: a. 消息处理成功 b. 消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第二种情况, 就会造成消息丢失。 那么如何确保消费端已经成功接收了, 并正确处理了呢? 为了保证消息从队列…

QML开发入门1--安装QT6.8和新建第一个QtQuickApplication

1.下载在线安装工具 qt-online-installer-windows-x64-4.8.1.exe 2.安装 注&#xff1a;可能官网qt安装很慢。需要使用国内镜像源。推荐阿里镜像 qt-online-installer-windows-x64-4.8.1.exe --mirror https://mirrors.aliyun.com/qt3.配置QT关键配置 3.1 无法编译 注&#…

如何让节卡机器人精准对点?

如何让节卡机器人精准对点&#xff1f; JAKA Zu 软件主界面主要由功能栏、开关栏、菜单栏构成。 菜单栏&#xff1a;控制柜管理&#xff0c;机器人管理与软件管理组成。主要功能为对控制柜关机、APP 设置、机器人本体设 置、控制柜设置、连接机器人和机器人显示等功能。 开关…

在 Spring Boot 中调用 AnythingLLM 的发消息接口

整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口&#xff1a;/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . Windows Installation ~ AnythingLLMhttps://docs.anythingllm.com/installation-desktop/windows http://localhost:3…

[GHCTF 2025]Popppppp[pop链构造] [php原生类的利用] [双md5加密绕过]

题目 <?php error_reporting(0);class CherryBlossom {public $fruit1;public $fruit2;public function __construct($a) {$this->fruit1 $a;}function __destruct() {echo $this->fruit1;}public function __toString() {$newFunc $this->fruit2;return $new…

Tr0ll2靶机详解

一、主机发现 arp-scan -l靶机ip&#xff1a;192.168.55.164 二、端口扫描、漏洞扫描、目录枚举、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.164发现21端口的ftp服务开启 以UDP协议进行扫描 使用参数-sU进行UDP扫描 nmap -sU --min-rate 10000 -p- 19…

制造业数字化转型,汽车装备制造企业数字化转型案例,智能制造数字化传统制造业数字化制造业数字化转型案例

《某制造业企业信息化整体解决方案》PPT展示了一个汽车装备企业的整体信息化解决方案&#xff0c;阐述了该企业的业务特点和现状&#xff0c;主要包括按订单生产、多级计划和产品跟踪等&#xff0c;分析了信息化建设的主要困难&#xff0c;如信息管理手工化、过程数据追溯困难、…

科技云报到:AI Agent打了个响指,商业齿轮加速转动

科技云报到原创。 3月16日&#xff0c;百度旗下文心大模型4.5和文心大模型X1正式发布。目前&#xff0c;两款模型已在文心一言官网上线&#xff0c;免费向用户开放。 同时&#xff0c;文心大模型4.5已上线百度智能云千帆大模型平台&#xff0c;企业用户和开发者登录即可调用AP…

【蓝桥杯python研究生组备赛】005 数学与简单DP

题目1 01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&a…

大白话读懂java对象创建的过程

1. java对象创建流程&#xff08;大白话版&#xff09; 咱们java对象被创建的过程大致如下&#xff0c;即&#xff1a; 在 JVM 中对象的创建&#xff0c;从⼀个 new 指令开始&#xff1a; 首先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引用检查这个符号引用代表…

AI图像理解技术的演进

在CLIP等现代多模态模型出现之前&#xff0c;早期的图生文技术主要依赖人工标注的ImageNet等数据集&#xff0c;但其技术路线与当前方法存在本质差异。 一、传统图生文技术的标注依赖 ImageNet的核心地位 在2012-2020年间&#xff0c;ImageNet的1,400万张人工标注图像&#xff…

电脑节电模式怎么退出 分享5种解决方法

在使用电脑的过程中&#xff0c;许多用户为了节省电力&#xff0c;通常会选择开启电脑的节能模式。然而&#xff0c;在需要更高性能或进行图形密集型任务时&#xff0c;节能模式可能会限制系统的性能表现。这时&#xff0c;了解如何正确地关闭或调整节能设置就显得尤为重要了。…

【Java】——程序逻辑控制(构建稳健代码的基石)

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 文章目录&#xff1a; 一.顺序结构二.分支结构1.if 语句1.1 语法格式11.2 语法格式21.3 语法格式3 …

卫星互联网智慧杆:开启智能城市新时代​

哇哦&#xff01;在当下这个数字化浪潮正以雷霆万钧之势席卷全球的超酷时代&#xff0c;智慧城市建设已然成为世界各国你追我赶、竞相发力的核心重点领域啦&#xff01;而咱们的卫星互联网智慧杆&#xff0c;作为一项完美融合了卫星通信与物联网顶尖技术的创新结晶&#xff0c;…

Qt-QChart实现折线图

一、介绍场景 动态查看数据变化&#xff0c;或者了解数据发展趋势&#xff0c;让数据可以形象直观展现出来&#xff0c;这里推荐使用折线图的方式展现&#xff0c;本文抛砖引玉&#xff0c;简单实现一个实例&#xff0c;效果图如下&#xff1a; 二、实现步骤 1、charts组件 …

取消Win10锁屏界面上显示的天气、市场和广告的操作

要取消Win10锁屏界面上显示的天气、市场和广告&#xff0c;您可以按照以下步骤操作&#xff1a; 方法一&#xff1a;更改锁屏界面设置 打开“设置”&#xff1a; 点击“开始”菜单&#xff0c;然后点击齿轮状的“设置”图标。 进入“个性化”&#xff1a; 在“设置”窗口中&a…

从TouchDriver Pro到Touchdriver G1,Weart触觉手套全系解析:XR交互的“真实触感”如何实现?

Weart旗下的Touchdriver Pro触觉手套和Touchdriver G1触觉手套&#xff0c;凭借其技术创新&#xff0c;为用户带来了全新的触觉体验。Touchdriver Pro触觉手套通过多模态触觉反馈技术&#xff0c;提供力反馈、纹理渲染和温度提示&#xff0c;让用户在虚拟环境中感受到真实的触觉…

排序算法实现:插入排序与希尔排序

目录 一、引言 二、代码整体结构 三、宏定义与头文件 四、插入排序函数&#xff08;Insertsort&#xff09; 函数作用 代码要点分析 五、希尔排序函数&#xff08;ShellSort&#xff09; 函数作用 代码要点分析 六、打印数组函数&#xff08;PrintSort&#x…

UDP协议原理

UDP协议原理 本篇介绍 在前面使用UDP编程时已经基本了解了UDP的工作模式&#xff0c;也知道了UDP有三个特点&#xff1a; 无连接不可靠面向数据报 但是当时并没有具体谈论为什么UDP有以上三个特点&#xff0c;基于这个原因&#xff0c;本篇就会针对这三个原因进行介绍 UDP…

EtherCAT转Modbus网关如何在倍福plc组态快速配置

EtherCAT转Modbus网关如何在倍福plc组态快速配置 在工业控制领域&#xff0c;EtherCAT和Modbus是两种常见的总线通信协议。EtherCAT以其高速的数据传输和灵活的网络配置被广泛应用于高性能自动化控制系统中&#xff0c;而Modbus则因其简单、稳定且兼容性强而被许多设备所支持。…