说下JVM中一次完整的GC流程?

news/2025/2/19 2:34:26/

大家好,我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助;

说下JVM中一次完整的GC流程?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

JVM中的一次完整的垃圾回收(GC)流程可以概括为以下几个步骤:

1. 标记阶段 (Mark)

  • 目标:找出所有"存活"的对象。
  • 过程:JVM的垃圾回收器首先通过从GC Root开始遍历对象图,标记所有可达的对象。GC Root通常是线程栈、静态字段和本地方法栈等可以直接访问的对象。
  • 标记过程需要跟踪从GC Root出发可达的对象,标记所有与GC Root有路径连接的对象。

2. 清除阶段 (Sweep)

  • 目标:清除所有没有被标记的对象,即"不可达"对象。
  • 过程:GC将遍历堆中的对象,将那些没有被标记为可达的对象删除。这个过程释放内存空间,垃圾对象将被回收并且内存可重新分配。
  • 注意:在某些情况下,如垃圾回收器没有合并内存(例如Serial GC,Parallel GC等),清除后可能会导致内存碎片。

3. 整理阶段 (Compact)

  • 目标:防止内存碎片。
  • 过程:如果是整理式垃圾回收(如Old Generation的Full GC),在回收不可达对象后,内存区域中的存活对象会被整理,使得这些对象紧凑地排列在一起。这样做的目的是减少内存碎片,使得对象能够高效地分配,避免频繁的垃圾回收。
  • 整理的过程一般会将存活的对象向内存区域的一端移动,合并出一个连续的大块空闲内存区域。

4. 更新指针

  • 目标:更新引用。
  • 过程:经过标记和整理之后,可能会有一些对象的引用地址发生了变化。在这个阶段,JVM会更新所有引用被回收对象的指针,使得它们指向新的位置。

5. 结束阶段 (Finalization)

  • 目标:执行对象的终结方法。
  • 过程:在对象被回收之前,JVM可以调用对象的finalize()方法。如果该对象覆盖了finalize()方法,JVM会调用该方法用于做一些清理工作(如关闭资源等)。需要注意的是,finalize()方法的调用并非是GC过程的一部分,且不是所有垃圾回收都会触发它。

GC类型

JVM中有多种GC算法,其中最常见的几种是:

  • Serial GC:适合单线程环境,它在回收过程中会暂停整个应用线程。
  • Parallel GC:多个线程并行工作,加速垃圾回收。
  • CMS GC (Concurrent Mark-Sweep):并发回收标记阶段和清除阶段,以减少停顿时间。
  • G1 GC:分代回收与并行回收相结合,目标是减少停顿时间,并且适应大堆内存的环境。

垃圾回收过程的细节

在不同的GC算法中,GC的过程会有所不同,特别是在停顿时间、并行性、内存整理等方面的表现。在实际应用中,选择合适的垃圾回收算法对于提高JVM的性能至关重要。

小结

JVM中的垃圾回收流程大致如下:

  1. 标记阶段:标记所有可达的对象。
  2. 清除阶段:回收不可达的对象,释放内存空间。
  3. 整理阶段:整理内存,避免碎片。
  4. 更新指针:更新引用地址。
  5. 结束阶段:调用finalize()方法(可选)。

在不同的GC算法中,标记、清理和整理的顺序及策略可能有所不同,但大体流程一致。


http://www.ppmy.cn/news/1573250.html

相关文章

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…

deepseek:三个月备考高级系统架构师

一、备考总体规划(2025年2月11日 - 2025年5月) 1. 第一阶段:基础夯实(2025年2月11日 - 2025年3月10日) 目标:快速掌握系统架构师考试的核心知识点。 重点内容: 计算机组成原理、操作系统、数据…

12、《Spring Data JPA:极简数据库操作实战》

《Spring Data JPA:极简数据库操作实战》 开篇:为什么需要Spring Data JPA? 在Java企业级开发中,数据库操作往往是业务代码的核心,但传统的JDBC或ORM框架(如MyBatis)需要开发者编写大量模板化…

DeepSeek-R1 蒸馏 Qwen 和 Llama 架构 企业级RAG知识库

“DeepSeek-R1的输出,蒸馏了6个小模型”意思是利用DeepSeek-R1这个大模型的输出结果,通过知识蒸馏技术训练出6个参数规模较小的模型,以下是具体解释: - **知识蒸馏技术原理**:知识蒸馏是一种模型压缩技术,核…

Python 基础-使用dict和set

dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 举个例子,假设要根据同学的名字查找对应的成绩&am…

【CSS】部分div禁用tailwindcss

部分div禁用tailwindcss 添加css /* 禁用tailwind */ .reset-tailwind, .reset-tailwind * {all: revert; }示例 <template><div class"flex h-screen flex-col bg-white"><div class"reset-tailwind"><h1 class"rrr"&g…

Dest1ny漏洞库: 美团代付微信小程序系统任意文件读取漏洞

大家好&#xff0c;今天是Dest1ny漏洞库的专题&#xff01;&#xff01; 会时不时发送新的漏洞资讯&#xff01;&#xff01; 大家多多关注&#xff0c;多多点赞&#xff01;&#xff01;&#xff01; 0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程…

uniapp webview嵌入外部h5网页后的消息通知

最近开发了个oa系统&#xff0c;pc端的表单使用form-create开发&#xff0c;form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。移动端使用uniapp开发&#xff0c;但是因为form-create移动端只支持vant&#xff0c;不支持uniapp。官…