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

在Java中常见的垃圾回收算法有哪些_JavaGC算法对比说明

星涛小哥_4330

星涛小哥_4330

发布时间:2026-02-02 13:06:09

|

535人浏览过

|

来源于php中文网

原创

Java通过可达性分析算法判断对象是否可回收:从GC Roots出发,无引用链可达的对象才可能被回收,需经两次标记后才能进入回收队列。

在java中常见的垃圾回收算法有哪些_javagc算法对比说明

怎么判断一个对象该被回收了?不是看引用计数

Java不用引用计数算法,哪怕它实现简单、效率高——因为循环引用会导致两个对象互相“挽留”,计数永远不为0,内存就漏了。实际用的是可达性分析算法:从GC Roots(比如栈帧里的局部变量、静态字段、常量池项、JNI引用)出发,顺着引用链往下找;凡是没有路径连到GC Roots的对象,才可能被回收。注意,“可能”不等于“立刻回收”——还要经历两次标记(比如finalize()方法是否执行过),才能真正进回收队列。

标记-清除、复制、标记-整理,三者怎么选?看内存区域

不同算法不是凭空选的,而是和堆结构强绑定:

  • 标记-清除:只标记+清空,不移动对象,所以快但碎片多。老年代对象存活率高,移动成本大,适合用它,但得配合内存整理策略或触发Full GC来缓解碎片
  • 复制算法:Eden区 + 两个Survivor区(S0/S1)就是典型实现。每次把Eden和其中一个Survivor里活的对象拷到另一个Survivor,然后整块清空。98%对象朝生夕死,所以拷贝少、无碎片;但代价是总有一半Survivor空间闲置(默认比例是Eden:S0:S1 = 8:1:1)
  • 标记-整理:老年代常用。标记完把所有活对象往内存一端压,再清理边界外内存。不碎片、不浪费空间,但要移动对象+更新所有引用指针,STW时间比标记-清除更长

为什么分代回收是默认方案?不是因为它高级,而是因为它真实

分代不是玄学,是基于大量应用观测得出的经验规律:绝大多数对象生命周期极短(比如方法内临时创建的StringBuilder、ArrayList),只有极少数能活过几次Minor GC。所以JVM把堆切成年轻代(Eden + S0 + S1)和老年代,分别施以不同策略:

  • 年轻代用复制算法:轻量、快停顿、适配高死亡率
  • 老年代用标记-整理或标记-清除:避免频繁拷贝长寿命对象
  • 对象年龄达阈值(默认15次Minor GC)自动晋升到老年代;大对象(如大数组)可能直接分配进老年代,跳过年轻代

这个设计让GC停顿时间可预测,也大幅降低整体回收频率。

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

别光看算法名字,得盯住实际触发条件和副作用

算法本身没好坏,关键是你调参后它在什么场景下“爆发”:

  • 频繁Minor GC?可能是Eden太小,或对象创建太快(比如循环里new HashMap)
  • 老年代突然涨满触发Full GC?常见原因是年轻代对象“躲过”晋升阈值,或有大对象直接进老年代,又或者元空间(Metaspace)爆了
  • 用Parallel GC时吞吐优先,但单次停顿可能很长;用G1 GC则追求可控停顿,但需要合理设置MaxGCPauseMillis,否则反而更慢

最常被忽略的一点:GC算法效果高度依赖对象分配模式和引用生命周期。写代码时随手new一堆短命对象没问题,但若长期持有static Map<String, Object>又忘了清理,再好的算法也救不了内存泄漏。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

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

DeepSeek

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

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

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

蛙蛙写作

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6479

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6104

2023.10.24

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

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

359

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5927

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2528

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5927

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2528

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

590

2025.09.05

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

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

0

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