讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里常见的垃圾回收算法有哪些_JavaGC算法解析

雨敏同学_9902

雨敏同学_9902

发布时间:2026-01-21 10:09:35

|

344人浏览过

|

来源于php中文网

原创

标记-清除算法因内存碎片化导致频繁Full GC;复制算法实际浪费约10%内存而非50%;标记-整理适用于高存活率场景,分代收集是策略框架而非独立算法。

在java里常见的垃圾回收算法有哪些_javagc算法解析

Java里常见的垃圾回收算法就四种:标记-清除、复制、标记-整理、分代收集——其中分代收集不是独立算法,而是策略框架,底层仍靠前三种实现。

标记-清除算法为什么会导致频繁的 Full GC?

它只做两件事:标记所有从 GC Roots 可达的对象,再 清除 所有未标记对象。问题出在“清除”之后:内存块被零散释放,形成大量不连续空洞。

  • 当新对象(比如一个大数组)需要分配时,JVM 找不到足够大的连续空间,就会触发 Full GC 来强行整理——哪怕老年代其实还有很多空闲字节
  • 典型现象:ParNew 回收后 Old Gen 使用率缓慢爬升,但没明显对象晋升,却突然卡顿数秒,日志里出现 Full GC (Ergonomics)
  • HotSpot 中,Serial Old 和早期 CMS 的初始标记/清除阶段就用这个逻辑,所以 CMS 在并发失败(concurrent mode failure)时会退化成 Serial Old,直接卡死

复制算法真只浪费 50% 内存?别被教科书骗了

教科书说“把内存一分为二”,但 HotSpot 实际用的是 Eden:S0:S1 = 8:1:1 比例,也就是年轻代总共 10 份,只预留 1 份作“备份区”。

  • 每次 Minor GC 把 Eden + 当前 Survivor(比如 S0)中存活对象,复制到另一个空 Survivor(S1),然后清空 Eden+S0
  • 真正浪费的是那 10% 的 Survivor 空间——前提是对象能活过一次 GC;如果 Eden 区 98% 对象都死掉,复制成本极低
  • 陷阱:把 -XX:SurvivorRatio 调得太小(比如设成 2),会导致 Survivor 不够用,大量对象提前晋升到老年代,反而加剧老年代压力

标记-整理 vs 复制:什么时候该选哪个?

关键看对象存活率。复制算法怕“活得多”,标记-整理怕“动得慢”。

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载

立即学习“Java免费学习笔记(深入)”;

  • 年轻代用复制:因为 98% 对象朝生夕死,复制少量存活对象比移动全部对象快得多
  • 老年代不用复制:假设一次 GC 后 70% 对象还活着,复制就得搬走 70% 数据,指针重定向开销巨大,STW 时间不可控
  • 所以 Serial Old、Parallel Old、G1 的混合回收(mixed GC)后期都会用标记-整理逻辑——把存活对象往一端压,腾出大片连续空间
  • 注意:G1 名义上是“分区复制”,但它对跨 Region 引用的处理、以及 Evacuation 失败后的退化行为,本质上仍是标记-整理思路的变体

分代收集不是算法,是 JVM 的默认生存规则

它不解决“怎么回收”,而是决定“在哪回收、何时回收、用什么算法回收”。你改不了它,但必须理解它的默认契约:

  • 新对象一律进 Eden;经历一次 Minor GC 还活着,就进 Survivor;熬过 -XX:MaxTenuringThreshold(默认 15)次,或 Survivor 放不下,就晋升到 Old Gen
  • 老年代满了才触发 Full GC(CMS 除外);但年轻代 GC 频繁且老年代增长快,往往意味着有隐性内存泄漏(比如缓存没设上限、监听器未注销)
  • 别盲目调大 -Xmn:年轻代太大 → Minor GC 停顿变长;太小 → 晋升加速 → 老年代更快填满 → 更多 Full GC

真正难的从来不是记住算法名字,而是看懂 GC 日志里那一行 PSYoungGen: 123456K->7890K(131072K) 背后,到底是对象在合理流转,还是正在悄悄滑向 OOM 边缘。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6276

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

60

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

40

2026.10.22

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn