G1垃圾回收

news2024/9/23 19:24:35

目录

    • 一、G1垃圾回收器
      • G1垃圾回收阶段(3个)
        • ① Young Collection
        • ② Young Collection + CM
        • ③ Mixed Collection
      • Young Collection 跨代引用
      • Remark
      • G1—垃圾回收器优化
        • 字符串去重
        • 类卸载
        • 巨型对象
        • 动态调整阈值

一、G1垃圾回收器

定义:
Garbage First(优先回收那些垃圾较多的区域以达到暂停时间短的目标)

JDK 9以后默认使用,而且替代了CMS 收集器
在这里插入图片描述
适用场景
● 同时注重吞吐量和低延迟(响应时间),默认的暂停目标是200ms
● 超大堆内存(内存大的),会将堆内存划分为多个大小相等的区域(每个区域差不多为1248M,每个区域都可以独立的作为伊甸园、幸存区、老年代)
● 整体上是标记+整理算法,两个区域之间是复制算法

相关参数:JDK8 并不是默认开启的,所需要参数开启
在这里插入图片描述

G1垃圾回收阶段(3个)

在这里插入图片描述

新生代伊甸园垃圾回收—–>内存不足(老年代内存超过预值),新生代回收+并发标记—–>回收新生代伊甸园、幸存区、老年代内存——>新生代伊甸园垃圾回收(重新开始)

① Young Collection

分区算法region
分代是按对象的生命周期划分,分区则是将堆空间划分连续几个不同小区间,每一个小区间独立回收,可以控制一次回收多少个小区间,方便控制 GC 产生的停顿时间

E:伊甸园 S:幸存区 O:老年代
● 会STW

【当类加载时,新创建的对象会分配到E(伊甸园)区,当其被逐渐占满会触发新生代垃圾回收】
在这里插入图片描述
【新生代垃圾回收将幸存的对象拷贝到幸存区(复制算法)】
在这里插入图片描述
【当幸存代区对象也较多时并且存活年龄超过一定时间会触发新生代垃圾回收,幸存区部分对象会晋升至老年代,将不够年龄的对象再次拷贝到另一个幸存区】
在这里插入图片描述

② Young Collection + CM

CM:并发标记(由根对象出发沿着引用链标记其他对象)

● 在 Young GC 时会对 GC Root 进行初始标记(找到根对象)
● 在老年代占用堆内存的比例达到阈值时,对进行并发标记,不会影响到用户的工作线程(不会STW),阈值可以根据用户来进行设定

-XX:InitiatingHeapOccupancyPercent=percent (默认45%)

在这里插入图片描述

③ Mixed Collection

会对E S O 进行全面的回收

● 最终标记
拷贝存活

-XX:MaxGCPauseMills:xxx 用于指定最长的停顿时间

【E区幸存对象会被复制到Survive区中,另一些Survive区中不够年龄的也会复制其中,符合晋升条件的对象会放入老年代中】===>属于新生代垃圾回收(发生在混合收集阶段)

【老年代区域经过并发标记阶段发现部分对象无用后同样采用复制算法将对象放入一个新的老年代区===>属于新生代垃圾回收】
在这里插入图片描述
:为什么有的老年代被拷贝了,有的没拷贝?

因为指定了最大停顿时间,如果对所有老年代都进行回收,耗时可能过高。为了保证时间不超过设定的停顿时间,会回收最有价值的老年代(回收后,能够得到更多内存)

Full GC(G1何时触发Full GC)
G1在老年代内存不足时(老年代所占内存超过阈值)

● 如果垃圾产生速度慢于垃圾回收速度,不会触发Full GC,还是并发地进行清理
● 如果垃圾产生速度快于垃圾回收速度,并发收集失败,退化为一个串行的收集(触发Full GC,与CMS相同)

Young Collection 跨代引用

● 新生代回收的跨代引用(老年代引用新生代)问题
在这里插入图片描述

● 卡表与Remembered Set(记录外部对它的引用)
———Remembered Set 存在于E中,用于保存新生代对象对应的脏卡
————脏卡:O被划分为多个区域(一个区域512K),如果该区域引用了新生代对象,则该区域被称为脏卡
好处 :在GC Root遍历时不用去找整个老年代,而是只需要关注脏卡对象(减小搜索范围,提高扫描根对象效率
● 在引用变更时通过post-write barried(写屏障)+ dirty card queue(异步操作)

● concurrent refinement threads 更新 Remembered Set
在这里插入图片描述

Remark

重新标记阶段
● pre-write barried + satb_mark_queue(在对象引用改变前将对象加入队列并表示其为未被处理的

在垃圾回收时,收集器处理对象的过程中

黑色已被处理,需要保留的
灰色正在处理中的
白色还未处理的

【并发标记阶段对象的处理状态】
在这里插入图片描述

但是在并发标记过程中,有可能A被处理了以后未引用C,但该处理过程还未结束,在处理过程结束之前A引用了C,这时就会用到remark

过程如下

● 之前C未被引用,这时A引用了C,就会给C加一个写屏障,写屏障的指令会被执行,将C放入一个队列当中,并将C变为 处理中 状态
● 在并发标记阶段结束以后,重新标记阶段会STW,然后将放在该队列中的对象重新处理,发现有强引用引用它,就会处理它
在这里插入图片描述

G1—垃圾回收器优化

其优化在持续进行中,以下为JDK8~JDK9的优化,更新的优化可参考Oracle官方文档

字符串去重

JDK 8u20 字符串去重

优点与缺点
● 节省了大量内存
● 新生代回收时间略微增加,导致略微多占用CPU

-XX:+UseStringDeduplication(开启字符串去重功能,默认打开)

String  s1=new String("hello");   //char[]{'h','e','l','l','o'}
String  s2=new String("hello");   //char[]{'h','e','l','l','o'}

过程
● 将所有新分配的字符串(底层是char[])放入一个队列
● 当新生代回收时,G1并发检查是否有重复的字符串
● 如果字符串的值一样,就让他们引用同一个字符串对象
● 注意,其与String.intern的区别
——intern关注的是字符串对象
——字符串去重关注的是char[]
——在JVM内部,使用了不同的字符串标

类卸载

JDK 8u40 并发标记类卸载
在所有对象经过并发标记结束后,就能知道哪些类不再被使用。如果一个类加载器的所有类都不在使用,则卸载它所加载的所有类(从8u40开始以后)

-XX:+ClassUnloadingWithConcurrentMark 默认启用

巨型对象

JDK 8u60 回收巨型对象
● 一个对象大于region的一半时,就称为巨型对象
● G1不会对巨型对象进行拷贝
● 回收时被优先考虑
● G1会跟踪老年代所有incoming引用,如果老年代incoming引用为0的巨型对象就可以在新生代垃圾回收时处理掉
在这里插入图片描述

动态调整阈值

JDK 9 并发标记起始时间的调整
● 并发标记必须在堆空间沾满前完成,否则退化为FullGC
● JDK 9 之前需要使用 -XX:InitiatingHeapOccupancyPercent
● JDK 9 可以动态调整
—— -XX:InitiatingHeapOccupancyPercent 用来设置初始值
—— 进行数据采样并动态调整
—— 总会添加一个安全的空挡时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lanmp环境搭建,你需要一次独立安装来深入了解各个软件

一,安装Apache yum install httpd -y,安装apache,版本为2.4.6,最新为2.4.9。 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak; vim /etc/httpd/conf/httpd.conf (默认唯一) 端口改为8000,不能与Ngin…

File类的使用

java,File类File类静态成员变量构造方法常用方法用于创建、删除文件/文件夹的方法用于遍历文件/文件目录的方法文件过滤器方法File类 Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。 File对象代表磁盘…

数据分析的大体思路

目录标题数据分析企业数据的分析的三个方向:离线分析(Batch Processing)实时分析(Real Time Processing |Streaming):机器学习(Machine Learning)数据分析的流程明确分析的目的和思路…

JVM调优基本概念

1、jvm组成以工作流程 jvm组成 类装载器、运行时数据区(内存模型)、字节码执行引擎 工作大致流程 首先我们的java类编译成class类文件,当我们的class文件开始执行,我们的虚拟机便开始工作。 类加载器将class加载到运行时数据区…

SSM之Spring(一)

目录 一:Spring简介 1.1 Spring概述 1.2 SpringFrameWork 1.2.1 SpringFrameWork特性 1.2.2 Spring Framework五大功能模块 二:IOC 2.1 IOC容器 2.1.1 IOC思想 2.1.2 IOC容器在Spring中的实现 2.2 基于XML管理bean 2.2.1 入门案例 2.2.2 获取bean…

Golang switch 的使用的注意事项和细节

内容来自:尚硅谷-韩老师教学笔记,链接:尚硅谷 1)case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以) 2)case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致 3…

辞暮尔尔烟火年年,朝朝暮暮岁岁平安。(2022年度总结)

目录 前言: 一、第一件事情,重新认识自己,从内核出发 二、第二件事情,告别内卷,拥抱微雕 三、第三件事情,愿2023,你我更更好 前言: 今天是2022年12月31日,2022年的最…

Shell——变量与脚本运行的方式

文章目录变量定义变量的几种方式1)无引号2)单引号3)双引号4)反引号export定义变量变量的提取、修改与删除1)变量的提取2)变量的修改3)变量的删除特殊变量1)位置参数2)${#…

Jetpack组件(fragment)(1)

一.什么是Fragment? 碎片是活动的一部分,使得活动更加的模块化设计。我们可以认为碎片是一种子活动。 碎片拥有自己的布局,自己的行为及自己的生命周期回调。当活动在运行的时候,你可以在活动中添加或者移除碎片。你可以合并多个碎片在一个…

Android修炼之混淆

自嘲时刻 作为Java和Android开发者,大家应该都对混淆很熟悉了。网上也有各路大神提供的混淆模板,基本上直接拿来用就好。但我还是想捋一捋,因为工作中被混淆这家伙“玩弄”了好几次,必须把它记在小本本上。 介绍 基本概念 混淆…

Cesium中使用Sampler3D,3D纹理,实现体渲染

Cesium中使用Sampler3D,3D纹理,实现体渲染 Cesium目前(20221231)还不支持直接使用3D纹理,但是其实内部已经可以WebGL2,而且内置常量也有3DTexture。所以,可以通过仿Texture,来实现3…

如何彻底的理解需求,做出更好的软件

背景: 最近接到了一个需求,大概的需求就是我们有一些数据,默认分为了两类。如果变多的话,用户找起来非常的困难,针对这个现象我们提出了两点解决方案。1:添加搜索。2:添加分组。 第一波设计&…

Android的adb命令实战篇-1

2023年 —— 是充满希望的一年. 对于Android开发者而言,ADB命令或多或少都使用过,今天我们就一起来整体回顾一下吧。 ADB的全称:Android Debug Bridge 1. ADB(Android Debug Bridge) 在实际工作中,周围同事会抱怨记不住常用的a…

过寒假

小时候,每到一放假就被父亲送回奶奶家。除了寒假作业,我还会带一堆书回去看。我小时候特别喜欢到邮电局大厅去订阅报刊杂志,就连学校也会报名订阅报刊。我小学时看完梁羽生的《七剑下天山》就是翻日报上每天的小说连载看完的。那时候过年时家…

Unity AR小游戏(玩具小车)踩坑记

最近对AR产生了兴趣。先科普一下什么是AR吧。AR是Augmented Reality(增强现实)的简称,是基于摄像头对现实世界的实时图像采集、分析和理解,然后在此基础上融入虚拟物体(信息),以达到增强体验的目…

Three.js学习(一)初识three.js

文章目录1.基本配置2.基本概念3.Api4.实现一个旋转动画1.基本配置 (1)安装 ​ npm install three (2)引入 import * as THREE from three2.基本概念 Three.js是基于原生WebGL封装运行的三维引擎。 (1)一…

【Linux】实验四 进程信号通信

文章目录一、实验目的二、 实验内容三、 实验原理1、信号3.1.1 信号的基本概念3.1.2、信号的发送2、所涉及的系统函数调用3.2.1 fork()3.2.2 kill( )This is my question.3.2.3 signal( )代码例子3.2.4 getpid()3.2.5 wait()四、 实验内容五、程序代码运行结果六、实验总结及心…

来玩,前端性能优化(+面试必问:宏任务和微任务)

前端性能优化相关的“技能点”笔者之前也写过几篇,但是大多都是小打小闹。我重新整理了曾经使用过的性能优化手段。本文介绍三种方案:页面资源预加载、服务请求优化和非首屏视图延迟加载。 页面资源预加载 页面是不可能真正预加载的,但是有…

Linux | PCIe Hotplug | 概念及工作原理的不完全总结

本文对 PCIe 热插拔的概念及工作原理进行不完全总结。 更新: 2022 / 12 / 31 Linux | PCIe Hotplug | 概念及工作原理的不完全总结热插拔组成部件实现代码通知式热插拔线程中断功耗管理意外移除错误处理整合移除BAR参考链接参考这里 1’ 2’ 3‘ 4’ 5 1992年初始…

postgresql数据库安装,备份还原

一.postgresql数据库安装 1.下载软件包 地址:PostgreSQL: File Browser 2.解压安装 [rootpostgresql u01]# tar -zxf postgresql-14.2.tar.gz安装环境 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel op…