0

0

gc在java中原理分析

舞夢輝影

舞夢輝影

发布时间:2025-12-19 13:57:40

|

437人浏览过

|

来源于php中文网

原创

java垃圾回收本质是自动管理堆内存,通过可达性分析(以gc roots为起点)判定对象存活,按分代理论将堆分为新生代(eden+s0/s1)和老年代,分别采用复制、标记-清除/整理算法回收;minor gc在eden满时触发,full gc在老年代不足等情况下触发。

gc在java中原理分析

Java 中的垃圾回收(GC)本质是自动管理堆内存,识别并回收不再被引用的对象,释放空间供新对象使用。核心在于判断“哪些对象可被回收”,以及“何时、如何回收”。

对象存活判定:可达性分析

Java 不采用引用计数法(因无法解决循环引用),而是基于可达性分析(Reachability Analysis):以一组称为“GC Roots”的对象为起点,向下搜索引用链;所有能被这条链触及的对象视为“存活”,其余即为可回收对象。

常见的 GC Roots 包括:

  • 虚拟机(栈帧中的局部变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象(如字符串常量池里的引用)
  • 本地方法栈中 JNI(即 Native 方法)引用的对象

分代收集理论:按对象生命周期分区域处理

HotSpot 虚拟机将堆分为新生代(Young Gen)老年代(Old Gen),依据是“绝大多数对象朝生夕灭”的经验规律。

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

新生代进一步划分为 Eden 区 + 两个 Survivor 区(S0、S1)。对象优先分配在 Eden;一次 Minor GC 后,存活对象进入 Survivor;经历多次 Minor GC 仍存活(默认 15 次,由 -XX:MaxTenuringThreshold 控制),则晋升至老年代。

ShoopD 网上商店系统
ShoopD 网上商店系统

用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最

下载

这种划分让 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。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
java基础知识汇总
java基础知识汇总

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

1561

2023.10.24

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

143

2023.12.26

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

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

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

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1128

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1102

2024.04.29

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

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

精品课程

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

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.6万人学习

Java 教程
Java 教程

共578课时 | 76.4万人学习

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

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