黑马JVM总结(十七)

(1)G1_简介

下面介绍一种Grabage one的垃圾回收器,在jdk9的时候称为默认的回收器,废除了之前的CMS垃圾回收器,它的内部也是并发的垃圾回收器

我们可以想到堆内存过大,肯定会导致回收速度变慢,因为要涉及到对象的复制、标记,内存过大,对速度会产生影响,划分为小的区域进行管理,可以进行一些优化,标记和复制的速度

在jdk1.8还不是默认的额需要使用参数启动:-XX:+Use1GC

-XX:G1HeapReginSize:设置区域的大小

-XX:MaxGCPauseMillis:默认暂停目标

(2)G1_新生代垃圾回收

Young Collection:新生代的垃圾回收

Young Collection+ Concurrent Mark:新生代的垃圾收集同时执行一些并发的标记

Mixes Collection:混合收集

三个阶段是一个循环的过程,开始时新生代的垃圾收集,当老年代的内存超过阈值啦,那么它会在新生代垃圾回收的同时进行一个并发的标记,等这个阶段完成以后进行一个混合收集(对新生代幸存区、老年代都来进行一个大规模收集),回收结束伊甸园的内存都被释放掉会再次进入新生代的回收过程

新生代的工作流程:第一个阶段

内存布局:

Grabage one的垃圾回收器将堆内存划分为一个个大小相等的区域,每个区域都可以作为伊甸园,幸存区和老年代,刚开始区域都是白色的,表示时空闲的区域,我们类加载时新创建的对象,刚开始会分配到伊甸园区域绿色的E代表伊甸园区域,当伊甸园逐渐被占满时,会进行新生代的垃圾回收,会触发一个较短时间的Stop the World

新生代的垃圾回收把这个幸存的对象 ,已复制的算法把它放到幸存区

在工作一段时间,当幸存区的对象比较多了,或者幸存区的的对象寿命超过一定时间(大小),会再触发新生代的垃圾回收,幸存区的对象会晋升到老年代

如果寿命不够年龄,会拷贝到另外一个幸存区去

(3)G1_新生代回收+CM

下面 Grabage one的垃圾回收器垃圾回收的第二个阶段 CM指Current Mark并发标记

我们进行垃圾回收的过程中需要进行初始标记和并发标记,初始标记呢我要找到哪些根对象,并发标记呢是从根对象触出发顺着引用链在找到其他的一些对象,初始标记是在新生代发生是就已经标记了

当老年代占用对空间达到阈值时进行并发标记,并发标记不会影响到用户的工作线程

E是伊甸园区 S是幸存区 O为老年代占有的区

当老年代占用总去45%的时候就并发标记了

(4)G1_混合回收

Grabage one的垃圾回收器垃圾回收的第三个阶段

E是伊甸园区会根据复制算法到幸存区中,幸存区的一些对象不够寿命的复制到另一个幸存区S,符合晋升条件的对象会晋升到一个老年代中去,这些属于新生代的回收,老年代的区域经过之前的并发标记阶段,发现一些对象也没用了,老年代也是采用复制算法把老年代中幸存对象复制到新的老年代区

为什么没有把所有的箭头划到这个O区呢?因为这个垃圾回收器会根据最大暂停时间,有选择的进行一个回收,有的时候我们的堆内存太大了老年代的垃圾回收时间可能比较长,达不到我们设置的最大暂停时间,垃圾回收器呢会从老年代里找到回收价值最高的区,挑选一部分区 进行垃圾回收,

复制的区域少了,就能达到最大暂停的时间,如果要复制的对象没那么多,最大暂停时间也可以达到,那么它会把所有的区都进行一个复制动作,复制一方面为了保留存活对象,一方面为了整理内存减少空间碎片

最终标记这个阶段在并发标记过程中漏掉一些对象,并发标记的同时用户线程也在工作,改变对象的垃圾和引用都会对并发标记的结果产生影响,需要暂停一下,执行最终标记

相关推荐
阿龟在奔跑11 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
王佑辉12 小时前
【jvm】方法区常用参数有哪些
jvm
王佑辉12 小时前
【jvm】HotSpot中方法区的演进
jvm
Domain-zhuo12 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
Theodore_10221 天前
7 设计模式原则之合成复用原则
java·开发语言·jvm·设计模式·java-ee·合成复用原则
我是苏苏1 天前
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
java·前端·jvm
天草二十六_简村人2 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
老码沉思录2 天前
Android开发实战班 - 数据持久化 - Room 数据库应用
android·jvm·数据库
起名字真南2 天前
【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案
java·jvm·c++·chatgpt·aigc
偶尔。5352 天前
JVM垃圾回收算法详解
jvm