当前位置: 首页 > news >正文

JVM垃圾回收算法和分代收集算法的区别

一、概要:

JVM 中的垃圾回收算法是一个广义的概念,包含了所有用于识别和回收无用对象的基本算法思想;而分代收集算法是一种组合式的回收策略,它基于对象的生命周期特征,将上述基本算法应用到不同的内存区域中。简单来说:分代收集算法是垃圾回收算法的一种具体实现方式,是对基本垃圾回收算法的综合运用

二、垃圾回收算法(基础算法)

指识别和回收垃圾对象的核心思想和基本方法,主要包括以下几类:

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

    • 过程
      ① 标记:遍历所有对象,标记出可达的存活对象(通过 GC Roots 追溯)。
      ② 清除:回收所有未被标记的对象(垃圾),释放内存。
    • 优缺点
      优点:实现简单,无需移动对象。
      缺点:清理后会产生大量内存碎片,可能导致后续大对象无法分配内存;标记和清除过程效率较低(需遍历所有对象)。

  2. 复制算法(Copying)

    • 过程
      ① 将内存分为大小相等的两块(如 From 区和 To 区)。
      ② 只使用其中一块(From 区),当内存不足时,将存活对象复制到另一块(To 区),然后清空 From 区。
    • 优缺点
      优点:无内存碎片,分配内存时只需指针移动,效率高。
      缺点:内存利用率低(仅用一半);复制大量存活对象时成本高。

  3. 标记 - 整理算法(Mark-Compact)

    • 过程
      ① 标记:同 “标记 - 清除”,标记存活对象。
      ② 整理:将所有存活对象向内存一端移动,然后直接清理边界外的内存。
    • 优缺点
      优点:解决了 “标记 - 清除” 的内存碎片问题,内存利用率高。
      缺点:整理阶段需要移动对象,成本较高(尤其是存活对象多的情况)。

三、分代收集算法(组合策略)

分代收集算法不是独立的新算法,而是根据对象的生命周期长短,将堆内存划分为不同区域(如新生代、老年代),并为每个区域选择最适合的基础垃圾回收算法。

核心依据:对象的生命周期特征

  • 新生代(Young Generation)
    绝大多数对象创建后很快成为垃圾(如局部变量),存活时间短,存活率低。
  • 老年代(Old Generation)
    少数对象存活时间长(如缓存对象、单例对象),存活率高,且可能被长期引用。

对于新生代,内部又被分为了三个区域。Eden区,S0区,S1区【8:1:1】

当对新生代产生GC:MinorGC【young GC】

当对老年代代产生GC:Major GC

当对新生代和老年代产生FullGC: 新生代 + 老年代完整垃圾回收,暂停时间长,应尽力避免

(一)分代回收的具体实现

  1. 新生代:采用复制算法

    • 原因:新生代对象存活率低,复制成本低,且复制算法无碎片、分配效率高。
    • 细节:新生代进一步分为 Eden 区(80%)和两个 Survivor 区(From/To 各 10%)。对象优先在 Eden 区分配,回收时将 Eden 和 From 区的存活对象复制到 To 区,然后清空 Eden 和 From 区,From/To 区角色互换。
  2. 老年代:采用标记 - 清除标记 - 整理算法

    • 原因:老年代对象存活率高,若用复制算法会导致大量复制操作,效率低;而标记 - 清除 / 整理算法适合处理存活对象多的场景(虽然整理有移动成本,但老年代回收频率低)。

分代回收操作示例如下:

①新创建的对象,都会先分配到eden区

②当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象,将存活对象采用复制算法复制到 to 中,复制完毕后,伊甸园和 from 内存都得到释放

③经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将存活的对象复制到from区

④之后一直重复上述过程,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)

(二)MinorGC、 Mixed GC 、 FullGC的区别是什么

  • MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)

  • Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有

  • FullGC: 新生代 + 老年代完整垃圾回收,暂停时间长(STW),应尽力避免?

STW(Stop-The-World):暂停所有应用程序线程,等待垃圾回收的完成

四、区别与关系

维度垃圾回收算法(基础算法)分代收集算法(组合策略)
本质独立的垃圾回收思想(如标记 - 清除、复制等)基于对象生命周期的分区域回收策略
适用场景通用的垃圾回收逻辑针对不同生命周期的对象优化回收效率
与其他算法的关系独立存在,可单独使用依赖基础算法(如新生代用复制,老年代用标记 - 整理)
目的解决 “如何回收垃圾” 的问题解决 “如何更高效回收不同类型对象” 的问题

关系:分代收集算法是对基础垃圾回收算法的按需组合和优化,属于垃圾回收算法的一个子集。现代 JVM(如 HotSpot)的垃圾收集器(如 G1、CMS)均基于分代收集思想设计,同时结合了多种基础算法的优点。

五、总结

基础垃圾回收算法是 “工具”,解决了垃圾回收的基本逻辑(标记、清除、复制、整理)。

分代收集算法是 “策略”,通过划分内存区域,为不同区域选择最合适的 “工具”,从而提升整体回收效率。

可以说,分代收集算法是 JVM 对基础垃圾回收算法的工程化应用,是实践中优化垃圾回收性能的核心方案。

http://www.dtcms.com/a/309095.html

相关文章:

  • 插件升级:Chat/Builder 合并,支持自定义 Agent、MCP、Rules
  • 深度学习(鱼书)day08--误差反向传播(后三节)
  • Day 28:类的定义和方法
  • 属性的运用和理解
  • 赛博算命之八字测算事业运势的Java实现(四柱、五行、十神、流年、格局详细测算)
  • Redisson实现Redis分布式锁的原理
  • Windows和Linux的tree工具
  • 【智能协同云图库】第七期:基于AI调用阿里云百炼大模型,实现AI图片编辑功能
  • 渗透测试报告通常包含哪些关键内容?
  • redis快速部署、集成、调优
  • Linux通用SPI作为Master——回环测试
  • Redis学习-----Redis的基本数据类型
  • Dify版本升级实操
  • Edge中如何找到原IE浏览器的Internet选项
  • 基于html,css,jquery,django,lstm,cnn,tensorflow,bert,推荐算法,mysql数据库
  • 8月1日RED指令强制生效,您的设备准备好了吗?
  • uniapp 开发微信小程序,获取经纬度(uni.getLocation)并且转化详细地址(‌高德地图逆地理编码API、‌腾讯地图逆地理编码)
  • 【华为机试】127. 单词接龙
  • Python match-case 模式匹配详解
  • 【Mysql】字段隐式转换对where条件和join关联条件的影响
  • 【Java面试题】缓存穿透
  • 什么是doris
  • 优化网站域名的SEO策略指南
  • Qt开发中的安全技术问题详解
  • MySQL(172)如何进行MySQL的全局变量设置?
  • 深度揭秘端口映射:原理、场景、路由映射故障,与内网IP端口映射外网工具的选择
  • 微服务消息队列之RabbitMQ,深入了解
  • 逻辑斯蒂回归的模型优化
  • IO流-文件实例
  • MySQL--组从复制的详解及功能演练