Java 垃圾回收标记清除与复制算法怎么比

轻静吖_7734

轻静吖_7734

2026-08-12

752人浏览

原创

标记清除适合老年代,因存活对象多、不移动对象节省开销且空间利用率高,但会产生内存碎片;复制算法专用于年轻代,因对象存活率低,可高效复制存活对象并消除碎片,但需预留空间。

java 垃圾回收标记清除与复制算法怎么比

标记清除和复制算法不是“哪个更好”的选择题,而是分工明确、各司其职的两种策略——关键看用在哪儿、对象活得久不久、停顿能不能忍。

标记清除适合老年代:存活对象多、移动成本高

老年代里对象普遍“活久见”,比如缓存、单例、长生命周期的业务对象。标记清除只做两件事:先从GC Roots出发标记所有可达对象,再统一回收没被标记的内存。它不挪动对象,省了复制开销,空间利用率接近100%。

  • 优点:不用搬数据,对大对象友好;内存不浪费,适合长期驻留场景
  • 缺点:清完留下一堆小碎片,万一来个8MB字节数组,就可能因找不到连续空间而直接触发Full GC
  • 典型搭配:CMS(已弃用)、Serial Old、Parallel Old 默认都用标记-整理(它的升级版),但底层逻辑仍继承自标记清除思路

复制算法专治年轻代:对象死得快、搬得轻松

新生代95%以上对象活不过一次Minor GC,复制算法正是为这种“朝生暮死”量身定制。它把内存切成Eden + 两个Survivor(比如8:1:1),GC时只把Eden和一个Survivor里活着的对象拷到另一个Survivor,然后整块清空——天然紧凑、无碎片、清理极快。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 优点:一次搬运+整页清零,效率高;绝对不产生碎片;天然支持对象年龄晋升
  • 缺点:总得空着一块区域备用,理论空间利用率最多50%(实际通过Eden占比优化)
  • 注意点:Survivor太小,活对象没地方放,只能提前进老年代;MaxTenuringThreshold设太高,短命对象反复复制,白耗CPU

别硬套,分代才是底层逻辑

JVM不是拿一个算法打天下,而是按对象年龄分代管理:年轻代用复制(G1/ZGC早期阶段也用类似思路),老年代避开复制(搬不动、不划算),改用标记-整理或并发标记清除。G1的混合回收本质是“挑几块Region做精细复制”,ZGC和Shenandoah则绕开传统算法,靠读屏障+染色指针实现几乎不暂停的并发整理。

  • 选算法,核心看三点:对象平均存活率、可接受的GC停顿时间、堆内存是否分代
  • 把复制硬塞进老年代?等于让快递员每天扛着冰箱跑五公里——吞吐暴跌,GC时间翻倍
  • 在年轻代用标记清除?碎片几天就堆满,Minor GC越来越频繁,很快拖垮系统

实际调优更看重组合效果

单独比较算法本身意义不大。真正影响性能的是整个回收链路:比如ParNew(复制)配CMS(标记清除+并发清理)曾是经典组合;现在G1默认年轻代复制、老年代标记整理;ZGC全程不区分代,但靠硬件特性达成毫秒级停顿。

  • 观察指标优先看:GC频率、单次停顿时间、晋升到老年代的速度、Full GC是否频繁
  • 调参方向不是换算法,而是匹配行为——比如SurvivorRatio调小一点,给复制留足缓冲;-XX:MaxTenuringThreshold设为6,避免过早晋升
  • 新项目建议直接用G1或ZGC,它们自动适配不同区域,不用手动纠结用哪个算法

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9517

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6682

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5932

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1044

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

868

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1236

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2489

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19831

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1135

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习