黑马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区呢?因为这个垃圾回收器会根据最大暂停时间,有选择的进行一个回收,有的时候我们的堆内存太大了老年代的垃圾回收时间可能比较长,达不到我们设置的最大暂停时间,垃圾回收器呢会从老年代里找到回收价值最高的区,挑选一部分区 进行垃圾回收,

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

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

相关推荐
麦兜*4 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
真实的菜15 小时前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
在未来等你16 小时前
JVM调优实战 Day 15:云原生环境下的JVM配置
java·jvm·性能优化·虚拟机·调优
黄雪超1 天前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice1 天前
对象的finalization机制Test
java·开发语言·jvm
很小心的小新1 天前
12、jvm运行期优化
java·开发语言·jvm·笔记
ThetaarSofVenice1 天前
垃圾收集相关算法Test
java·jvm·算法
暮 夏2 天前
Java测试题一
java·开发语言·jvm
程序员弘羽2 天前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
好名字更能让你们记住我2 天前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos