Java 中的 young GC、old GC、full GC 和 mixed GC 的区别

在 Java 中,垃圾回收(GC)可以分为几种不同类型,包括 young GCold GCfull GCmixed GC。每种 GC 类型有其特定的作用域和目标,下面详细介绍它们的区别。


1. Young GC(年轻代垃圾回收)

特点:

  • 作用范围:仅回收新生代中的对象。
  • 回收过程:主要清理 Eden 区Survivor 区 中的对象。
  • 回收触发:当新生代的内存空间不足时触发。
  • 回收频率:由于新生代对象通常生命周期较短,Young GC 会频繁发生。
  • 算法:一般使用 复制算法,通过复制存活的对象到 Survivor 区,并清除不再存活的对象。

优点:

  • 高效:由于大多数对象都很快变成垃圾,回收速度较快。

示例:

  • 每次 Minor GC 都是 Young GC,专注于新生代的回收。

2. Old GC(老年代垃圾回收)

特点:

  • 作用范围:仅回收老年代中的对象。
  • 回收过程:老年代中的对象通常是存活较长时间的对象,老年代的回收相对较慢。
  • 回收触发:当老年代内存空间不足时触发。
  • 回收算法:常使用 标记-清除标记-整理算法,回收的过程会涉及对象的整理,减少内存碎片。

优点:

  • 较少发生:相比新生代的垃圾回收,Old GC 发生的次数较少,通常发生在系统运行时间较长时。

示例:

  • 每次 Major GCFull GC 都涉及到 Old GC,专注于回收老年代的对象。

3. Full GC(完全垃圾回收)

特点:

  • 作用范围:回收整个堆内存,包括 新生代老年代
  • 回收过程:执行整个堆的回收,涉及到 Young GCOld GC 的回收。
  • 回收触发:通常发生在以下情况:
    • 老年代空间不足时。
    • JVM 内存压力较大时。
    • 显式调用 System.gc() 时。
  • 影响:由于涉及整个堆的回收,Full GC 会停顿时间较长。

优点:

  • 彻底清理内存:通过回收整个堆,保证系统内存的彻底清理。

示例:

  • JVM 内存达到限制时,可能会触发 Full GC

4. Mixed GC(混合垃圾回收)

特点:

  • 作用范围:回收 新生代部分老年代 对象。
  • 回收过程:在回收新生代的同时,还会回收部分老年代的对象。
  • 回收触发:一般发生在使用 G1 GC(Garbage-First GC)时,当新生代的垃圾回收同时需要回收一部分老年代时。
  • 回收算法:结合了新生代的 复制算法 和老年代的 标记-整理算法

优点:

  • 提高回收效率:通过同时回收部分老年代,减少了老年代的内存压力,提高了垃圾回收的整体效率。

示例:

  • 使用 G1 GC 的时候,回收新生代和部分老年代的过程通常就是 Mixed GC

5. 总结

GC 类型 作用范围 触发时机 回收算法 优点
Young GC 新生代 新生代内存不足时 复制算法 回收快速,频繁发生
Old GC 老年代 老年代内存不足时 标记-整理、标记-清除算法 回收速度较慢,但发生频率较低
Full GC 新生代和老年代(整个堆) 堆内存不足、显式调用 System.gc() 综合回收 徹底回收内存,影响较大
Mixed GC 新生代和部分老年代 G1 GC 下,当新生代回收时,也回收部分老年代 复制算法 + 标记-整理算法 回收效率高,减少老年代压力

结论:

  • Young GCOld GC 专注于回收不同内存区域。
  • Full GC 涉及整个堆的回收,通常会停顿较长时间。
  • Mixed GCG1 GC 中回收新生代和部分老年代,优化了垃圾回收效率。

Java 中的 young GC、old GC、full GC 和 mixed GC 的区别是什么?的更多相关文章

  1. Java中的内存泄露 和 JVM GC(垃圾回收机制)

    一.什么是Java中的内存泄露? 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点, 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连:其次,这些对象是无用的,即程序以 ...

  2. gc之六--Minor GC、Major GC、Full GC以及Mixed GC之间的区别

    目录: GC之一--GC 的算法分析.垃圾收集器.内存分配策略介绍 GC之二--GC日志分析(jdk1.8)整理中 GC之三--GC 触发Full GC执行的情况及应对策略 gc之四--Minor G ...

  3. Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...

  4. java中的各种数据类型在内存中存储的方式

    原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...

  5. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...

  6. 一篇文章带你了解Java中的运算符

    前言 在前一篇文章中,壹哥给大家讲解了Java数据类型之间的转换,包括自动类型转换.强制类型转换.隐含的强制类型转换等问题.且在上一篇文章中,我还简单地给大家提到了Java的类型提升.在类型提升的案例 ...

  7. 【转】Java中的新生代、老年代、永久代和各种GC

    JVM中的堆,一般分为三大部分:新生代.老年代.永久代: 1 新生代 主要是用来存放新生的对象.一般占据堆的1/3空间.由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收. 新生代又分为 ...

  8. 2. Java中的垃圾收集 - GC参考手册

    标记-清除(Mark and Sweep)是最经典的垃圾收集算法.将理论用于生产实践时, 会有很多需要优化调整的地点, 以适应具体环境.下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保 ...

  9. Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  10. Java中GC的工作原理

    转文: 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个 ...

随机推荐

  1. Ping测试记录脚本

    @echo off echo PingTest del PingTest_result.txt timeout /t 10 echo=> PingTest_result.txt :TEST ec ...

  2. Spring Boot项目设置跨域

    一.跨域设置 新建一个配置类 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterC ...

  3. Luogu P2540 NOIP2015提高组 斗地主 加强版 题解 [ 紫 ] [ 深搜 ] [ 剪枝 ]

    斗地主:一步一步推性质就能做出来的剪枝题. 这题思路和小木棒的剪枝思路极其相似,剪枝的角度都差不多. 其实大部分搜索剪枝题都是先观察性质,列出性质后选择几个比较关键且代码好写的性质进行剪枝,特别要注意 ...

  4. 干货:DeepSeek+SpringAI实现流式对话!

    前面一篇文章我们实现了<炸裂:SpringAI内置DeepSeek啦!>,但是大模型的响应速度通常是很慢的,为了避免用户用户能够耐心等待输出的结果,我们通常会使用流式输出一点点将结果输出给 ...

  5. [THUPC2017] 天天爱射击 题解

    俗话说的好,正难则反,既然不好想每一个子弹能打碎多少个木板,不如想每个木板被那枚子弹打碎. 然后就是显然的整体二分.由于可能木板不会被击碎,那些木板的分数会累加到最后一个子弹上,因此我们可以加一枚背锅 ...

  6. 4个Sprint目标的挑战以及解决的技巧

    1. Sprint 目标太大 有时,您的团队可能会尝试将过多的任务塞进冲刺中.抵制在冲刺中承担太多的诱惑,因为这会损害你的速度和持续交付的能力. 2. Sprint目标是模糊的 冲刺目标通常是不确定的 ...

  7. Typecho浏览统计和热门文章调用插件TePostViews

    TePostViews是一款简单的typecho热门文章调用插件,通过该插件可以显示每篇文章的阅读次数,以及调用阅读次数最多或者评论数最多的文章作为热门文章调用,用户可以自由选择调用依据和调用文章的数 ...

  8. docker - [12] 镜像发布到DockerHub、阿里云

    题记部分 一.镜像发布到 DockerHub 1.地址:https://hub.docker.com/ 注册自己的账号 2.确定这个账号可以登录 3.在服务器上提交镜像 4.登录之后提交镜像即可. [ ...

  9. 再谈Mysql undo log, redo log与binlog

    一.undo log 1.undo log有两个作用 提供回滚和多个行版本控制(MVCC). 在数据修改的时候,不仅记录了redo log,还记录了对应的undo,如果因为某些原因事务失败而回滚,可以 ...

  10. 【Matlab】判断点和多面体位置关系的两种方法实现

    分别是向量判别法(算法来自他人论文).体积判别法(code 是我从网上找的). 方法一: 向量判别法 方法来自一会议论文:<判断点与多面体空间位置关系的一个新算法_石露>2008年,知网. ...