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

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


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

特点:

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

优点:

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

示例:

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

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

特点:

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

优点:

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

示例:

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

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

特点:

  • 作用范围:回收整个堆内存,包括 新生代 和 老年代。
  • 回收过程:执行整个堆的回收,涉及到 Young GC 和 Old 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 GC 和 Old GC 专注于回收不同内存区域。
  • Full GC 涉及整个堆的回收,通常会停顿较长时间。
  • Mixed GC 在 G1 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. ADC温敏电阻测温

    一.ADC采样电路 使用热敏电阻与连续逼近型寄存器 (SAR) 模数转换器 (ADC) 直接监测温度的电路.温度检测电路使用负温度系数 (NTC) 热敏电阻与电阻串联构成分压器. 参考电压:VCC 分 ...

  2. 登上国际舞台!天翼云P4 EIP网关流量管理创新方案亮相CCGrid 2024!

    5月8日,第24届IEEE/ACM集群.云和互联网计算国际研讨会(CCGrid 2024)在美国费城隆重举行.来自中国.美国.印度.法国等国家的学术及产业界代表齐聚一堂,围绕云计算相关议题进行深入探讨 ...

  3. JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

    JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的? 最近要做一个项目升级,因为之前的项目中有用到ElasticSearch 7.10.1版本,在之前的漏扫环节时会出现Tomcat渗透为问题 ...

  4. 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员

    关注公众号回复1 获取一线.总监.高管<管理秘籍> 书接上文:DeepSeek怎么突然就比肩GPT了? 如前所述,应用层AI开发压根不会去刻意关注大模型底层实现,多数时候也关注不了. 但我 ...

  5. 安川YASKAWA工业机器人板卡维修策略

    一.安川YASKAWA工业机器人板卡识别故障症状 首先,需要准确识别电路板故障的症状.这通常包括安川YASKAWA机器人操作不稳定.错误代码频繁出现.某些功能失效或整体性能下降等.通过仔细观察和诊断, ...

  6. 科研界DeepSeek+AI应用协作攻略来了!

    自从DeepSeek爆火 AI应用届开启"精英集结" 与DeepSeek携手撑起国产AI一片天 比如,DeepSeek+Midjourney 成为设计师的好帮手 DeepSeek+ ...

  7. nacos(六): 创建第一个多模块微服务项目(生产者与消费者)

    要创建出生产者与消费者一体的多模块项目,总体来说分成三个步骤.分别是先创建出项目主体,再分别创建出生产者与消费者. 步骤一:创建项目主体 1. 先创建一个单体项目作为项目的主题.在这里,我们不用脚手架 ...

  8. Postman 接口测试工具详解

    一.引言 在软件开发和测试过程中,接口测试是至关重要的环节.Postman 作为一款功能强大的接口测试工具,为开发者和测试人员提供了便捷高效的测试解决方案. 二.Postman 简介 Postman ...

  9. 手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开

    原文链接: FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波.方波和三角波,频率小于1MHz.支持幅度调节,提供原始和6倍放大输出接口.配备5阶低通滤波器.噪 ...

  10. python ImportError: libGL.so.1: cannot open shared object file: No such file or directory

    前言 python 报错python ImportError: libGL.so.1: cannot open shared object file: No such file or director ...