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

ops/2024/12/13 3:14:28/

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

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

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

在JVM中,垃圾回收(GC) 是自动化内存管理的一部分,用于回收不再被引用的对象,释放内存资源。JVM的GC主要通过标记、清除和压缩等算法来管理内存。GC的过程较为复杂,涉及多个阶段和多个垃圾回收器。下面是一次完整的垃圾回收流程的详细介绍。

1. GC触发条件

GC的触发条件有多个,主要包括:

  • 堆内存不足:当JVM中的堆内存(年轻代、老年代)不足时,会触发GC。
  • 显式调用System.gc():调用该方法会触发GC,但JVM不一定会立刻执行。
  • 内存分配失败:在分配内存时,如果不能从堆中找到足够的空间,也会触发GC。
  • 老年代的空间不足:年轻代的GC不足以回收老年代所需的空间时,会触发Full GC。

2. GC的分代理论

JVM的堆内存通常分为三个区域:

  • 年轻代(Young Generation):包含新创建的对象。年轻代又分为三个区域:
    • Eden空间:新创建的对象首先会被分配到Eden区。
    • Survivor空间(S0, S1):Eden区存活下来的对象会被复制到其中一个Survivor空间。两个Survivor区交替使用。
  • 老年代(Old Generation):经过多次GC后仍然存活的对象会被提升到老年代。
  • 永久代(PermGen):用于存储类的元数据(JVM 8后被MetaSpace取代)。

3. GC的基本步骤

1) 年轻代GC(Minor GC)

年轻代GC发生在年轻代内存不足时,步骤如下:

  • 标记阶段
    • JVM首先会标记出年轻代中存活的对象。标记对象是通过引用计数可达性分析的方式确定的。
    • 在这个阶段,Root(如栈上的局部变量、静态变量等)会作为起始点,通过引用关系递归地遍历所有可达对象。
  • 复制阶段
    • 对象存活标记完成后,JVM会将存活的对象从Eden区复制到其中一个Survivor区。如果当前Survivor区已满,则会将对象转移到老年代。
    • 如果Survivor区的空间不足以容纳所有存活的对象,就会触发老年代GC(Full GC)。
  • 清理阶段
    • Eden区和原先的Survivor区会被清空,释放空间供新的对象使用。
2) 老年代GC(Major GC 或 Full GC)

老年代GC通常是在年轻代GC不能有效回收内存时发生,尤其是当老年代空间不足时触发。此时JVM会进行整个堆的垃圾回收:

  • 标记阶段
    • 对象的标记和年轻代GC相似,通过可达性分析标记存活对象。
  • 清理阶段
    • 清理所有未被标记的对象,释放内存空间。
  • 压缩阶段
    • 在老年代GC后,可能会进行内存压缩。即将存活的对象移到内存的一端,释放出连续的空闲内存。
3) GC算法

JVM中常用的GC算法包括:

  • 标记-清除(Mark-Sweep)
    • 标记所有存活的对象,然后清除未标记的对象。缺点是会产生内存碎片。
  • 复制算法(Copying)
    • 适用于年轻代的GC。将存活对象从一个区域复制到另一个区域,清空源区域,避免内存碎片。
  • 标记-整理(Mark-Compact)
    • 适用于老年代的GC。标记所有存活的对象并将其压缩到堆的一端,避免内存碎片。
  • 分代收集
    • 根据不同的对象生命周期,年轻代和老年代使用不同的GC算法来提高效率。年轻代采用复制算法,老年代采用标记-清除或标记-整理。

4. GC的执行过程

一个完整的GC过程可以分为以下几个步骤:

  1. GC Root Tracing:JVM会从GC Roots开始,通过引用链追踪可达的对象。
  2. 标记阶段:标记所有存活的对象,GC通过可达性分析找到所有从GC Root可达的对象。
  3. 清除阶段:对于未被标记的对象(即不可达的对象),会被清除。
  4. 压缩阶段(仅老年代GC时执行):将存活的对象移动到内存的一端,释放连续的空间。

5. GC类型

JVM有多种垃圾回收器,每个垃圾回收器的工作方式不同,常见的回收器包括:

  • Serial GC:单线程进行GC,适用于单核或小内存系统。
  • Parallel GC:多线程GC,适用于多核CPU。
  • CMS(Concurrent Mark-Sweep):旨在减少GC停顿时间的回收器,适用于低延迟需求。
  • G1 GC:一个面向大内存和低延迟的垃圾回收器,按区域划分堆内存,优化GC时间。

6. Full GC vs Minor GC

  • Minor GC:发生在年轻代,通常速度较快,但会对性能有轻微影响。
  • Full GC:发生在整个堆(包括年轻代和老年代),通常会暂停应用程序的执行较长时间,因此影响性能较大。

7. GC的停顿时间

  • Stop-the-World:在GC过程中,JVM会暂停应用程序的执行,这被称为"Stop-the-World"事件。垃圾回收器使用不同的算法来减少停顿时间,如G1 GC通过分区域处理减少单次GC停顿时间。

总结

一次完整的GC过程涉及:

  1. 触发条件(如内存不足、显式调用等);
  2. 垃圾回收的不同阶段(如标记、清理、压缩等);
  3. 多种GC算法(如标记-清除、复制算法等);
  4. 多种GC回收器(如Serial、Parallel、CMS、G1等)。

垃圾回收的目标是高效地回收内存,同时尽可能减少对应用程序性能的影响。


http://www.ppmy.cn/ops/141419.html

相关文章

DVWA亲测sql注入漏洞

LOW等级 我们先输入1 我们加上一个单引号&#xff0c;页面报错 我们看一下源代码&#xff1a; <?php if( isset( $_REQUEST[ Submit ] ) ) { // Get input $id $_REQUEST[ id ]; // Check database $query "SELECT first_name, last_name FROM users WHERE user_id …

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具&#xff0c;支持多种模型和训练方法&#xff0c;包括预训练、监督微调、强化学习等&#xff0c;同时提供量化技术和实验监控&#xff0c;旨在提高训练速度和模型性能。 官方开源地址&#xff1a;https://github.com/hiyouga/L…

【蓝桥杯Day1】:LCR 018. 验证回文串,left++<right--?

1&#xff1a;isalnum() 函数说明&#xff1a; 检查参数c,是否为英文字母或阿拉伯数字。 2.int toupper( int c)&#xff0c;toupper():将字母转位大写。 3.int tolower( int c)&#xff0c;tolower():将字母转为小写。 下面是我自己写的&#xff0c;感觉写的有点搓。 特别注…

系统安全——访问控制访问控制

访问控制 概念 什么是访问控制 access control 为用户对系统资源提供最大限度共享的基础上&#xff0c;对用户的访问权进行管理&#xff0c;防止对信息的非授权篡改和滥用 ​ 访问控制作用 保证用户在系统安全策略下正常工作 拒绝非法用户的非授权访问请求 拒绝合法用户越权…

【Java-数据结构篇】Java 中栈和队列:构建程序逻辑的关键数据结构基石

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 一、引言 1. 栈与队列在编程中的角色定位 栈和队列作为两种基本的数据结构&#xff0c;在众多编程场景中都有着独特的地位。它们为数据的有序…

【前端】live server如何让本地网页能在连接局域网的所有设备中打开

VScode中安装插件live server 找到工作目录中.vscode下方的settings.json 在其中添加下面设置 "liveServer.settings.host": "0.0.0.0", //确保在设置中选择了 0.0.0.0 作为监听地址&#xff0c;而不是 localhost 或 127.0.0.1。 //这将允许其他设备通过你…

对象函数原型

对象 创建对象 字面量{}new Object() 本质都是调用了Object构造函数,因此实例对象的__proto__指向Object.prototype对象 对象属性控制符 设置属性(默认属性描述符为false) Object.defineProperty(obj,key,{属性描述符})Object.defineProperties(obj,{key:{属性描述符},ke…

【单片机外设】MPU及Cache学习与开发

该篇主要&#xff1a;参考正点原子教程和安富莱教程 安富莱_STM32-V7_MPU及Cache部分.pdf 目录 1. 内存保护单元(MPU)介绍&#xff08;了解&#xff09; 1.1. 内存保护单元&#xff08;memory protection unit&#xff09;&#xff0c;简称&#xff1a;MPU 1.1.1. MPU的功能…