0

0

在Java中什么是垃圾回收机制_JavaGC原理解析

P粉602998670

P粉602998670

发布时间:2026-03-07 11:59:17

|

931人浏览过

|

来源于php中文网

原创

java gc通过可达性分析(从gc roots出发)判断对象是否可回收,新生代用复制算法因存活率低,老年代用标记-整理因存活率高,system.gc()仅是建议且副作用大。

在java中什么是垃圾回收机制_javagc原理解析

Java中的垃圾回收机制(GC)不是“自动清理内存”的模糊概念,而是一套基于可达性分析、分代管理、多算法协同的精密内存自治系统——它不依赖引用计数,不保证立即回收,也不承诺零停顿,但能大幅降低内存泄漏风险和开发负担。

GC怎么判断一个对象该被回收?不是看“有没有被new”,而是看“能不能从GC Roots触达”

Java不用引用计数法,因为循环引用(如objA.instance = objBobjB.instance = objA)会导致计数器永不归零,造成内存泄漏。JVM实际采用的是可达性分析算法:从一组固定的GC Roots出发,沿着引用链向下搜索。只要某对象无法被任何一条引用链抵达,它就被判定为“不可达”,即待回收垃圾。

常见的GC Roots包括:

  • 虚拟机栈中正在执行的方法的局部变量所引用的对象
  • 方法区中类的静态属性(static字段)引用的对象
  • 方法区中常量池里引用的对象(如字符串常量"hello"
  • 本地方法栈中JNI调用所持有的对象句柄

注意:局部变量一旦超出作用域(比如方法return),即使没显式置null,只要栈帧弹出,其引用就自然消失——GC Roots随之丢失,对象立刻进入可回收候选。

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

关于Objective
关于Objective

本文档主要讲述的是关于Objective-C手动内存管理的规则;在ios开发中Objective-C 增加了一些新的东西,包括属性和垃圾回收。那么,我们在学习Objective-C之前,最好应该先了解,从前是什么样的,为什么Objective-C 要增加这些支持。有需要的朋友可以下载看看

下载

为什么新生代用复制算法,老年代却用标记-整理?这是由对象存活率决定的

分代设计不是拍脑袋定的,而是大量实证统计的结果:约98%的对象朝生暮死(只活1–2次Minor GC)。因此JVM把堆划为新生代(Eden + 2个Survivor)和老年代,并匹配不同算法:

  • 新生代:存活对象少 → 用复制算法(如G1的Evacuation、ZGC的染色指针迁移)。好处是回收快、无碎片;代价是需预留一块空闲Survivor区做“搬运落脚点”
  • 老年代:对象存活率高、空间大 → 用标记-整理(如Serial Old)或标记-清除+压缩(如CMS已废弃,G1/ZGC靠并发移动)。若强行用复制,搬运成本太高,可能比停顿还伤性能

一个典型误操作:频繁创建长生命周期的大数组(如new byte[8 * 1024 * 1024]),它会直接绕过Eden,触发TLAB溢出大对象直接分配到老年代,加剧Major GC压力——这不是GC机制失效,而是代码模式与分代假设冲突。

System.gc()真的能触发垃圾回收吗?能,但几乎不该用

System.gc()只是向JVM发出“建议”进行Full GC,是否执行、何时执行、用哪个收集器,完全由JVM自主决定(HotSpot默认开启-XX:+DisableExplicitGC时甚至直接忽略)。它带来的副作用远大于收益:

  • 强制引发一次Stop-The-World暂停,可能卡住整个应用线程(尤其在生产环境高负载时)
  • 干扰JVM自身的GC节奏,导致后续Minor GC更频繁(例如刚清完老年代,又因显式GC打乱了对象年龄晋升策略)
  • 掩盖真实内存问题:比如本该优化缓存淘汰逻辑,却用System.gc()临时“压低”内存曲线

真正需要干预GC的场景,应通过JVM参数而非代码调用:比如用-XX:+PrintGCDetails -Xlog:gc*定位对象泄漏,用-XX:MaxGCPauseMillis=200约束ZGC停顿目标,而不是在finally块里写System.gc()

GC机制的复杂性不在“它做了什么”,而在“它为何这样权衡”——比如牺牲一半新生代空间换低延迟,容忍短暂碎片换吞吐,甚至允许部分对象“暂时漏收”来避免STW。理解这些取舍,比记住算法步骤更能帮你避开OOM和GC风暴。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

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字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

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

字符串介绍
字符串介绍

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

649

2023.11.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

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

相关下载

更多

精品课程

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

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.8万人学习

Java 教程
Java 教程

共578课时 | 77.8万人学习

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

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