黑马JVM总结(十七)

2023-09-19 17:21:04

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

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

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

更多推荐

【C++】构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 中 不能调用 构造函数 )

文章目录一、匿名对象生命周期1、匿名对象生命周期说明2、代码示例-匿名对象生命周期二、构造函数中调用构造函数1、构造函数中不能调用构造函数2、代码示例-构造函数中调用构造函数构造函数初始化列表总结:初始化列表可以为类的成员变量提供初始值;初始化列表可以调用类的成员变量类型的构造函数进行成员变量初始化操作;初始化列表可以

蓝桥杯 题库 简单 每日十题 day3

01约数个数题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。1200000有多少个约数(只计算正约数)。解题思路枚举,从1开始一直到1200000本身都作为1200000的除数,如果可以整除,则是它的约数#include<iostream>usingnamespacestd;intmai

【C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

文章目录一、类对象作为成员变量时的构造函数问题1、问题描述2、错误代码示例二、构造函数初始化列表1、构造函数初始化列表语法规则2、代码示例-构造函数初始化列表语法规则一、类对象作为成员变量时的构造函数问题1、问题描述如果一个类A的对象作为另外一个类B的成员变量时,在以下场景会报错:为类A定义有参的构造函数,那么A的无参

《重构改善代码设计》

文章目录1.重构的原则2.代码的坏味道3.第一组重构3.1.提炼函数3.2.内联函数3.3.提炼变量3.4.内联变量3.5.修改函数名称3.6.封装变量3.7.变量改名3.8.引入参数对象3.9.函数组合成类3.10.函数组合成变换3.11.拆分阶段4.封装4.1.封装记录4.2.封装集合4.3.以对象取代基本类型4.

redis 初识与入门

1.什么是RedisRedis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis提供了多种数据类型来支持不同的业务场景,比如String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)

Mysql的逻辑架构、存储引擎

1.逻辑架构剖析1.1服务器处理客户端请求首先MySQL是典型的C/S架构,即Clinet/Server架构,服务端程序使用的mysqld。不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果是:客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。那服务

什么是枚举类型?如何定义和使用枚举?

枚举类型是C语言中一种非常有用的数据类型,它允许你创建一组有限的命名常量,以提高代码的可读性和可维护性。本文将详细解释什么是枚举类型,如何定义和使用它们。什么是枚举类型?在C语言中,枚举类型(Enum)是一种用户定义的数据类型,它允许你为一组相关的常量赋予有意义的名字。枚举类型的主要优点是它可以帮助你使代码更易于理解,

优思学院|六西格玛核心方法:CTQ关键质量树

在六西格玛管理方法中,CTQ是Critical-To-Quality的缩写。CTQ代表客户需求,这些需求被认为是项目/产品/流程的成功与否的关键因素,得到了执行团队的认可。CTQ树最初是作为六西格玛方法的一部分开发的。然而,您可以在各种情况下使用它们,包括在为内部客户开发产品、流程和服务时。例如,“改善客户服务”这样的

面试中的压力测试:如何稳定自己的心态

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

Ribbon负载均衡器

两种:1.1集中式负载均衡,服务端负载均衡硬件nginx轮询、负载、哈希、随机、权重为什么要做负载均衡?1.2客户端负载均衡器用客户端负载均衡器很多机制可以自定义小知识:不想让别人调自己,只想用别人的,怎么做?只需要不注册spring.cloud.nacos.discovery.register-enabled=fal

【全面】CSS3新增了哪些新特性?

目录一、选择器的扩展1.属性选择器2.伪类选择器3.伪元素选择器二、盒子模型的增强1.box-sizing属性2.边框圆角(border-radius)3.盒阴影(box-shadow)三、过渡和动画效果1.过渡效果2.动画效果四、响应式布局1.媒体查询(mediaquery)2.弹性布局(Flexbox)CSS3是C

热文推荐