G1垃圾收集器

1.G1的目的:

Garbage First,也就是垃圾优先原则,也就是空间方面的关注点。同时照顾到停顿时间以及吞吐量。

G1垃圾收集器的设计目的是避免完全回收,但是当并发收集不能足够快地回收内存时,就会发生完全回收GC。G1的完整GC的当前实现使用单线程mark-sweep compact算法。

1.1JDK8为什么不用CMS做为默认垃圾收集器呢

1.CMS单线程或者双线程情况下效率很低

2.CMS会并发失败

3.CMS可中止的预处理会导致极限5S停顿

4.并发失败进入foregroud还会导致进入Full GC,全局MSC整理

5.CMS吞吐的设计并不是很优秀

1.2G1的特点:

内存空间的重新定义

更短的停顿时间,要多短就多短

某种程度上去解决空间碎片

2.内存空间的重新定义:region  

G1的一个Region大小可以单独设定,可以1-32M,设置需要已2的n次幂来设置,因为很多算法都是已2的n次幂来计算的,所以Region大小也要按照这个来实现

G1虽然保留了新老年代的概念,但是G1把他们分成了一个一个的Region。

2.1Region的角色:

自由角色FreeTag

新生代分区 YoungHeapRegion,细分为eden分区和survivor分区

大对象分区 HHR,细分为大对象头分区和大对象连续分区

老年代分区 OHR

JDK11之后有一类特殊的分区,叫做归档分区,关闭归档分区以及开放归档分区

3.TLAB(线程本地分配缓冲区 Thread Local Allocation Buffer)

分配空间时,为了提高JVM的运行效率,应当尽量减少临界区范围,避免全局锁。G1的通常的应用场景中,会存在大量的访问器同时执行,为减少锁冲突,JVM引入了TLAB(线程本地分配缓冲区 Thread Local Allocation Buffer)机制。

3.1TLAB作用:

我们知道对象内存分配时最初考虑在新生代的Eden区为对象分配内存,但堆区是线程共享的区域,在多线程环境下多个线程同时操控同一块内存的现象是普遍的,为了保证对象分配时数据的安全性,我们需要用全局锁来解决多线程同时访问同一块内存的问题,但全局锁会降低效率与程序的吞吐量,为了解决该问题TLAB应运而生

在分配线程对象时从JVM堆中分配一个固定大小的内存区域并将其作为线程的私有缓冲区,这个缓冲区称为TLAB只有在为每个线程分配TLAB缓冲区时才需要锁定整个JVM堆。

由于TLAB是属于线程的,不同的线程不共享TLAB,当我们尝试分配一个对象时,优先从当前线程的TLAB中分配对象,不需要锁,因此达到了快速分配的目的。

实际上TLAB是Eden区域中的一块内存,不同线程的TLAB都位于Eden区,所有的TLAB内存对所有的线程都是可见的,只不过每个线程有一个TLAB的数据结构,用于保存待分配内存区间的起始地址(start)和结束地址(end),在分配的时候只在这个区间做分配,从而达到无锁分配,快速分配。

虽然TLAB在分配对象空间的时候是无锁分配,但是TLAB空间本身在分配的时候(分配TLAB内存空间)还是需要锁的,G1中使用了CAS来并行分配。
 

对象的分配实在TLAB中进行,由于每个线程都有一个独立的TLAB,所以可以达到无锁分配,如果失败了就会发生GC

3.2G1对新老年代中的相互引用是怎么处理的?

G1在进行oldGC的时候都会进行youngGC,所以不用管新生代指向老年代的问题

记录引用关系的2中方式

obj1=obj2

out:所有的引用关系都记录在obj1中,我引用了谁

in:所有的引用关系都记录在obj2,谁引用了我,G1使用的这种,但是如果位置不够怎么办,引用集

4.RSet(RemeberSet)引用集

4.1稀疏表

本质上就是一种Hash表,Key是Region的起始地址,Value是一个数组,里面存储的元素是卡页的索引号。将一个Region分成小块,每个小块都是V中的一个值

4.2粗粒度位图

当细粒度位图 size超过阈值时,所有region 形成一个 bitMap。如果有region 对当前 Region 有指针指向,就设置其对应的bit 为1,也就是粗粒度位图

一个位图对应一个Region

4.3细粒度位图

就是一个C位图,但是这个位图,可以详细的记录我们的内存变化,包括并发标记修改,对应元素标识等 当稀疏表指定region的card数量超过阈值时,则在细粒度位图中创建一个对应的PerRegionTable对象。一个Region地址链表,维护当前Region中所有card对应的一个BitMap集合。

5.什么是写屏障:

因为Store Buffer导致读写的顺序不一致,而写屏障可以解决这个问题 

多核情况下,cpu0与CPU1共享一个数据,如果0修改了数据那么就要将这个数据置为失效,并且通知1,还要等到1的回执才能继续执行,这样就会很慢,这时就加入了Store Buffer,先写入Store Buffer,等到收到AcKnowledgement的时候,再把数据刷入缓存,但是这个时候还有一个问题,写数据走了Store Buffer,如果读取的时候不走Store Buffer直接走cache,不就导致数据不一致了么,所以,读要同时走cache和Store Buffer

StoreBuffer,导致读写不一致

a的值可能因为是Share(共享)先被写入了Store Buffer,并发送通知其他cpu置为Invalid(失效)
b的值,可能因为在cache中已经存在并且是Exclusive(独占)直接被写进cache中。
读取的时候因为先读b的值,b被刷进主存供读取
后面要读a,因为还没收到失效通知,从cache中直接拿到a,断言失败。
 

5.1写屏障的内存伪共享问题:

如果不同线程对对象引用的更新操作,恰好位于同一个64KB区域内,这将导致同时更新卡表的同一个缓存行,从而造成缓存行的写回、无效化或者同步操作,间接影响程序性能。 

5.2解决方案:

不采用无条件的写屏障,而是先检查卡表标记,只有当该卡表项未被标记过才将其标记为dirty。 这就是JDK 7中引入的解决方法,引入了一个新的JVM参数-XX:+UseCondCardMark,

6.G1的Rset同步异步问题:

异步更新操作需要引入DCQS(Dirty Card Queue Set)结构。

JVM声明了一个全局的静态结构G1BarrierSet,其中包含两个Queue Set,DirtyCardQueueSet和G1SATBMarkQueueSet,分别用于处理DCQS和STAB

G1常用参数: -XX: +UseG1GC 开启G1垃圾收集器 -XX: G1HeapReginSize 设置每个Region的大小,是2的幂次,1MB-32MB之间 -XX:MaxGCPauseMillis 最大停顿时间 -XX:ParallelGCThread 并行GC工作的线程数 -XX:ConcGCThreads 并发标记的线程数 -XX:InitiatingHeapOcccupancyPercent 默认45%,代表GC堆占用达到多少的时候开始垃圾收集

7.G1常用参数:

-XX: +UseG1GC 开启G1垃圾收集器

-XX: G1HeapReginSize 设置每个Region的大小,是2的幂次,1MB-32MB之间

-XX:MaxGCPauseMillis 最大停顿时间

-XX:ParallelGCThread 并行GC工作的线程数

-XX:ConcGCThreads 并发标记的线程数

-XX:InitiatingHeapOcccupancyPercent 默认45%,代表GC堆占用达到多少的时候开始垃圾收集

7.G1相对于CMS的的优势:

1.G1在压缩空间方面有优势。

2.G1通过将内存空间分成区域(Region)的方式避免内存碎片问题

3.Eden、Survivor、Old区不再固定,在内存使用率上来说更灵活

4.G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间,避免应用雪崩现象

5.G1在回收内存后会马上同时做合并空闲内存的工作,而CMS默认是在STW(stop the world)的时候做

6.G1会在Young GC中使用,而CMS只能在Old区使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业以太网交换机未来发展中的几个趋势

随着工业自动化不断发展和智能制造的推进,工业以太网交换机在未来的应用中将面临更多的发展机遇和挑战。在工业以太网交换机的未来发展中,有几个方面将成为趋势。 网络虚拟化 随着工业自动化系统规模的不断扩展,网络虚拟化将成为未来的发展方…

基于亚马逊云科技大语言模型等服务打造企业知识库

背景 大语言模型是自然语言处理领域的一项重要技术,能够通过学习大量的文本数据,生成具有语法和意义的自然语言文本。目前大语言模型已经成为了自然语言处理领域的一个热门话题,引起了广泛的关注和研究。 知识库需求在各行各业中普遍存在&a…

阿里云OSS代码集成部分问题分析

公司内部开发了一个文件相关的应用,由于服务器带宽限制导致多个用户同时上传或者下载文件时速度很慢,遂将文件迁移至阿里云OSS服务器。下面是迁移的过程中遇到的部分问题。 问题1. 跨域错误 错误信息如下: Access to XMLHttpRequest at htt…

关于同一接口有多个不同实现的设计方案

关于同一接口有多个不同实现的设计方案 前言 最近公司做了一个银行相关的项目,告诉我公司对接了多个银行的支付,每个银行都有对应的接口要去对接,比如:交易申请,交易取消,支付,回单&#xff0…

工作流引擎架构设计

一个应用MIS的系统的架构离不开工作流引擎,具有流程引擎思维的架构人员设计系统的时候就有流程的思维,他区别于过程思维,过程思维开发出来的系统,用户面对的是菜单、模块。而流程思维设计出来的系统就是发起、待办、在途、查询、近…

电子商务活动中无处不在的电商API接口|淘宝/天猫/京东/1688

我们的日常生活中无处不是API API已经成为我们日常生活中无处不在的技术,我们日常生活中的许多时刻都会涉及到API的应用: 支付API:支付API允许电商平台将其支付系统与第三方支付系统进行集成,从而为客户提供多种支付选项并实现更…

虚拟机系列:vmware和Oracle VM VirtualBox虚拟机的区别,简述哪一个更适合我?以及相互转换

一. VMware和Oracle VM VirtualBox虚拟机的区别主要体现在以下几个方面: 首先两种软件的安装使用教程如下: VMware ESXI 安装使用教程 Oracle VM VirtualBox安装使用教程 商业模式:VMware是一家商业公司,而Oracle VM VirtualBox是开源软件; 功能:VMware拥有更多的功能和…

docker安装nacos,实现和mysql容器的通信

1.下载nacos镜像 docker pull nacos/nacos-server2. 启动nacos 启动命令如下: docker run -d -p 8848:8848 --name nacos \ -e JVM_XMS256m \ -e JVM_XMX256m \ -e MODEstandalone \ -e SPRING_DATASOURCE_PLATFORMmysql \ -e MYSQL_SERVICE_HOST192.168.131.223…

css中flex两列布局(一列自适应其他固定)

问题 最近写一个布局的时候,遇到一个问题。如下图的布局。在没有图片的时候布局是正常的,如果有图片且设置了width:100%;height: 100%; 则会出现图片将自适应布局撑开的情况。 我的解决方式是让图片不缩放,图片外层再添加一个div元素。形如…

css Vue尺子样式

原生css生成尺子样式 <template><div class"page"><div class"Light"></div><div class"rile"><ul id"list"><!--尺子需要几个单位就加几个--><li></li><li></li&…

创意设计与个性化定制:酒精壁炉的独特之处

在当今家居装饰的潮流中&#xff0c;人们越来越注重个性化和创意&#xff0c;而酒精壁炉正是在这一趋势中崭露头角。它不仅成为家居的温馨之选&#xff0c;更因其设计的灵活性而成为创意焦点&#xff0c;吸引了越来越多注重家居设计的人群。 酒精壁炉的设计灵活性为家居注入了新…

kali部署ARL灯塔资产系统及使用教程

网上有很多ARL部署到centos系统的教程,但是部署到ubuntu或kali linux系统的教程都是乱七八糟,互相抄,而且没有一个能部署成功,鉴于此,写下此教程,帮助大家出坑 一、安装docker环境(网上什么弄钥匙呀,什么稳定源啊都是垃圾) 准备一个纯净的最新的kali linux系统 1、配…

巨菌草行业分析:到2027年市场规模预计将达到205.3亿元

中国菌草市场规模已逐渐扩大&#xff0c;并在各个领域发挥出其应用的巨大潜力。随着环保意识的普及和技术的不断创新&#xff0c;菌草市场有望继续保持良好的增长态势&#xff0c;为社会经济的可持续发展做出更大的贡献。 近年来&#xff0c;菌草这种新型的生态材料逐渐走进了大…

PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

“圆柱-计算公式“技术支持网址

该软件可以计算圆柱的底面圆周长、底面积、侧面积和体积。 您在使用中有遇到任何问题都可以和我们联系。我们会在第一时间回复您。 邮箱地址&#xff1a;elmo30zeongmail.com 谢谢&#xff01;

js检测dom变化的方法:MutationObserver

前言 检测一个原生dom的变化,如一个div的颜色,大小,所在位置,内部元素的属性是否变化,更深层dom树上的变化等等。 都可以使用一个window上暴露出来的一个api:MutationObserver 语法 官方地址:MutationObserver.MutationObserver() - Web API 接口参考 | MDN 使用new Mutat…

易点易动固定资产管理系统:全生命周期管理的理想选择

在现代企业中&#xff0c;固定资产管理是一项至关重要的任务。为了确保企业的资产安全、提高资产利用率&#xff0c;全面管理固定资产的生命周期至关重要。易点易动固定资产管理系统为企业提供了一种全面的解决方案&#xff0c;实现了从固定资产申购、采购、入库、领用、退库、…

docker的使用方法

文章目录 为什么要用dockerdocker安装docker工作原理docker命令docker搭建练习docker可视化docker镜像docker容器数据卷DockerFiledocker全流程Docker网络原理docker composedocker swarm 为什么要用docker 官网&#xff1a;https://www.docker.com文档地址&#xff1a;https:…

基于Vue+SpringBoot的天沐瑜伽馆管理系统

项目编号&#xff1a; S 039 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S039&#xff0c;文末获取源码。} 项目编号&#xff1a;S039&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课…

提供电商数据|带你简单认识天猫API接口相关参数文档调用说明

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…