0

0

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

P粉602998670

P粉602998670

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

|

495人浏览过

|

来源于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时间比标记-清除更长

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

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

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

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

ContentBot
ContentBot

内容自动化AI写作工具

下载

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

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

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

523

2023.08.02

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

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

1505

2023.10.24

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

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

399

2023.07.18

堆和栈区别
堆和栈区别

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

577

2023.08.10

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

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

399

2023.07.18

堆和栈区别
堆和栈区别

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

577

2023.08.10

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

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

75

2025.09.05

golang map相关教程
golang map相关教程

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

36

2025.11.16

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

16

2026.02.02

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.3万人学习

Java 教程
Java 教程

共578课时 | 55.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号