JVM中一次完整的GC回收流程

JVM堆内存结构简述

JVM堆内存结构图

堆初体验

所有的对象实例以及数组都要在堆上分配,堆是垃圾收集器管理的主要区域,也被称为"GC 堆",也是我们优化最多考虑的地方。因为在一个项目中,会不断地创建对象,都是在堆里创建,如果一直不回收就会导致OOM,我们听的最多的情况哈!还有经常说的JVM调优,也是对进行参数优化配置,达到最接近理想状态。

结构详情

新生代

大部分刚创建的对象首先都是放在年轻代,新生代内存按照 8:1:1 的比例分为一个 Eden 和两个 Survivor(Survivor from,Survivor to)。

1. Eden 空间

Eden空间:主要是存放刚刚创建的新对象,如果可以Eden空间充足,新对象直接存放在Eden中,如果对象过大,放不下则会触发 Minor GC(效率很快)

Survivor 空间

每次执行Minor GC,会将Eden区中存活的对象放到Survivor的From区,而在From区中,仍存活的对象会根据他们的年龄值来决定去向,逃过一次Minor GC年龄加1,默认年数为15,就要到老年区。(From Survivor和To Survivor的逻辑关系会在GC时发生颠倒:From变To , To变From,目的是保证有连续的空间存放对方,避免碎片化的发生,后面GC流程在详细说)

老年代

在新生代中经历了 N 次(默认15次)垃圾回收后仍然存活的对象,就会被放到年老代中。年老代中存放的都是一些生命周期较长的对象。当老年代内存满时触发 Major GC 即 Full GC,Full GC 发生频率比较低,执行时间也是Minor GC的十倍以上。在老年代的对象一般为:存活时间比较长的,还有就是比较大的对象。

永久代/元空间

Java8 以前永久代,受JVM 管理,java8 以后元空间,直接使用物理内存。元空间位于堆外,所以它的最大内存大小取决于系统内存,而不是堆大小,我们可以指定 MaxMetaspaceSize 参数来限定它的最大内存。

GC回收流程

一般来说,GC的触发是在对象分配过程中,当一个对象在创建时,他会根据他的大小决定是进入年轻代或者老年代。如果他的大小超过-XX:PretenureSizeThreshold就会被认为是大对象,直接进入老年代,否则就会在年轻代进行创建。(PretenureSizeThreshold默认是0,也就是说,默认情况下对象不会提前进入老年代,而是直接在新生代分配。然后就GC次数和基于动态年龄判断来进入老年代。)

在年轻代创建对象,会发生在Eden区,但是这个时候有可能会因为Eden区内存不够,这时候就会尝试触发一次YoungGC。

年轻代采用的是标记复制算法,主要分为,标记、复制、清除三个步骤,会从GC Root开始进行存活对象的标记,然后把Eden区和Survivor区复制到另外一个Survivor区。然后再把Eden和From Survivor区的对象清理掉。

这个过程,可能会发生两件事情,第一个就是Survivor有可能存不下这些存活的对象,这时候就会进行空间分配担保。如果担保成功了,那么就没什么事儿,正常进行Young GC就行了。但是如果担保失败了,说明老年代可能也不够了,这时候就会触发一次FullGC了。

还会发生第二件事情就是,在这个过程中,会进行对象的年龄判断,如果他经过一定次数的GC之后,还没有被回收,那么这个对象就会被放到老年代当中去。

而老年代如果不够了,或者担保失败了,那么就会触发老年代的GC,一般来说,现在用的比较多的老年代的垃圾收集器是CMS或者G1,他们采用的都是三色标记法。

也就是分为四个阶段:初始标记、并发标记、重新标记、及并发清理。

老年代在做FullGC之后,如果空间还是不够,那就要触发OOM了。

相关推荐
微风粼粼16 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
掘金-我是哪吒19 小时前
分布式微服务系统架构第158集:JavaPlus技术文档平台日更-JVM基础知识
jvm·分布式·微服务·架构·系统架构
abigalexy20 小时前
深入JVM底层-内存分配算法
jvm
weixin_ab1 天前
JMM--数据原子操作
jvm
超级小忍1 天前
JVM 中的垃圾回收算法及垃圾回收器详解
java·jvm
喝可乐的布偶猫2 天前
Java类变量(静态变量)
java·开发语言·jvm
abigalexy2 天前
深入JVM底层-垃圾回收GC算法
jvm
麦兜*2 天前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
真实的菜3 天前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
在未来等你3 天前
JVM调优实战 Day 15:云原生环境下的JVM配置
java·jvm·性能优化·虚拟机·调优