GC在Java中的运行机制解析
时间:2026-02-21 11:28:53 375浏览 收藏
Java垃圾回收(GC)是JVM自动管理堆内存的核心机制,通过可达性分析(以GC Roots为起点追踪引用链)精准识别存活对象,结合分代收集理论——将堆划分为新生代(Eden+S0/S1)和老年代,分别采用高效复制算法与标记-清除/整理算法进行差异化回收;Minor GC频繁清理新生代,Full GC则代价高昂、需谨慎规避;理解其触发时机、算法逻辑与调优原理,不仅能有效诊断OOM和频繁GC问题,更能帮助开发者在吞吐量、延迟与内存占用间做出明智权衡,真正掌控Java应用的性能命脉。

Java 中的垃圾回收(GC)本质是自动管理堆内存,识别并回收不再被引用的对象,释放空间供新对象使用。核心在于判断“哪些对象可被回收”,以及“何时、如何回收”。
对象存活判定:可达性分析
Java 不采用引用计数法(因无法解决循环引用),而是基于可达性分析(Reachability Analysis):以一组称为“GC Roots”的对象为起点,向下搜索引用链;所有能被这条链触及的对象视为“存活”,其余即为可回收对象。
常见的 GC Roots 包括:
- 虚拟机栈(栈帧中的局部变量表)中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象(如字符串常量池里的引用)
- 本地方法栈中 JNI(即 Native 方法)引用的对象
分代收集理论:按对象生命周期分区域处理
HotSpot 虚拟机将堆分为新生代(Young Gen)和老年代(Old Gen),依据是“绝大多数对象朝生夕灭”的经验规律。
新生代进一步划分为 Eden 区 + 两个 Survivor 区(S0、S1)。对象优先分配在 Eden;一次 Minor GC 后,存活对象进入 Survivor;经历多次 Minor GC 仍存活(默认 15 次,由 -XX:MaxTenuringThreshold 控制),则晋升至老年代。
这种划分让 GC 更高效:新生代用复制算法(快、无碎片),老年代用标记-清除或标记-整理(空间利用率高)。
GC 算法与常见收集器
不同代采用不同算法:
- 复制算法(Copying):用于新生代。暂停应用线程(STW),将 Eden 和一个 Survivor 中存活对象复制到另一个 Survivor,清空原区域。简单高效,但牺牲一半 Survivor 空间。
- 标记-清除(Mark-Sweep):用于老年代(如 CMS 的初始实现)。先标记所有存活对象,再清除未标记对象。缺点是产生内存碎片,可能触发 Full GC。
- 标记-整理(Mark-Compact):如 Serial Old、G1 的 Full GC 阶段。标记后将存活对象向一端移动,再清理边界外内存。避免碎片,但移动成本高。
主流收集器如 G1、ZGC、Shenandoah 已不再严格按分代,但依然依赖可达性分析 + 增量/并发标记等机制来降低 STW 时间。
触发 GC 的典型时机
GC 不是定时执行,而是由内存压力驱动:
- Eden 区满时触发 Minor GC(最频繁)
- 老年代空间不足,或 Minor GC 后晋升失败,触发 Full GC(代价高,应尽量避免)
- 元空间(Metaspace)满、System.gc() 显式调用(仅建议)、堆内存扩容失败等也可能触发
可通过 -XX:+PrintGCDetails -Xloggc:gc.log 查看 GC 日志,分析频率、停顿、回收效果。
基本上就这些。GC 的设计是在吞吐量、延迟、内存占用之间做权衡,理解原理有助于合理调参、定位 OOM 或频繁 GC 问题,而不是盲目调大堆或禁用 System.gc。
今天关于《GC在Java中的运行机制解析》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于java,GC原理的内容请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
136 收藏
-
423 收藏
-
355 收藏
-
180 收藏
-
234 收藏
-
388 收藏
-
127 收藏
-
418 收藏
-
328 收藏
-
311 收藏
-
439 收藏
-
304 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习