GC算法和常见垃圾回收器

一、GC算法

GC Algorithms(常见的垃圾回收算法),找到这个垃圾之后怎么进行清除的算法 。GC常用的算法有三
种如下:
1:Copying(拷贝)
2:Mark-Sweep(标记清除)
3:Mark-Compact(标记压缩)

第一个是Copying(拷贝)。非常简单,就是把内存一分为二,分开之后呢,把有用的拷贝到下面绿色
区域,拷贝完后上面全部清掉,回收完之后就变成下面的样子了,清楚简单。
在这里插入图片描述
第二个是叫Mark-Sweep,标记、清除。就是你把它标出来,然后清掉就这么简单。首先找到那些有用
的,没用的标出来然后给它清掉。
在这里插入图片描述
第三个Mark-Compact(标记压缩)。很简单,就是把所有的东西整理的过程,清理的过程同时压缩到头上去。回收之前,有用的全往前面走,哪怕这个地方是空的我也先给你压到前面去,剩下的大块空间就全部清出来了,这个叫标记压缩,整理完成之后就是下图这样的,看着特别爽,空间又是连续的还没有碎片。
在这里插入图片描述

二、GC算法问题

三种GC算法都有一定的问题,所以没法说哪个算法更加优越,看怎么使用。
1:copy算法逻辑简单,但是有一个显而易见的问题,就是空间浪费。
2:Mark-Sweep算法也有一个明显的问题,就是容易造成内存碎片。
3:Mark-Compact算法依然有它的问题,因为设计到对象的移动,移动的时候如果是多线程还要进行同步,效率较低,好处是不会产生内存碎片。

任何一个算法都有一定的问题,因此,java堆内存采用分代模型,垃圾回收器在不同的区域采用不同的回收算法。

在这里插入图片描述

一个对象产生之后首先进入伊甸区,伊甸区经过一次垃圾回收之后进入survivor区,survivor区在经过一次垃圾回收之后又进入另外一个survivor,与此同时伊甸区的某些对象也跟着进入另外一个survivor,什么时候年龄够了会进入到old区。
MinorGC/YGC: 年轻代空间耗尽时触发。
MajorGC/FullGC: 在老年代无法继续分配空间时触发,新生代老年代同时进行回收。

三、常见垃圾回收器

在这里插入图片描述
G1和ZGC在物理上已经不分代了。

3.1 Serial

在这里插入图片描述
很简单使用单线程进行垃圾回收,GC线程工作的时候会发生STW,所有的业务线程都会停止。

3.2 Serial Old

这个用在老年代,他用的是mark-sweep的算法,用的也是单线程,和Serial一样,同样会发生STW。

3.3 Parallel Scavenge

在这里插入图片描述
理解了Serial,就很容易理解Parallel Scavenge。Parallel Scavenge采用多线程来进行垃圾回收。本质的原因是,随着服务器内存不断增大,单进程的GC有点力不从心了。

3.4 Parallel Old

  • a compacting collector that uses multiple GC threads

用在老年代,和Parallel Scavenge的组合简称PS+PO,这个也是jdk1.8默认使用的垃圾回收器。

3.5 ParNew

和Parallel Scavenge基本没什么区别,就是为了和CMS配合使用推出的。

3.6 CMS(concurrent mark sweep)

CMS是一个里程碑式的垃圾回收器,原来的垃圾回收器在工作的时候,业务线程必须STW。CMS全称是并发标记清除垃圾回收器,允许GC线程和业务线程同时进行。CMS出现的本质原因是,随着服务器内存不断增大,GC线程并不是越多效率就越高,当内存很大的时候,多线程的GC,STW的时间也会很长。但是CMS毛病非常多。以至于目前任何jdk版本默认都不是CMS
在这里插入图片描述

  1. 第一个阶段叫做CMS initial mark(初始标记阶段)。很简单, 就是我直接找到最根上的对象,其他的对象我不标记,直接标记最根上的。会发生STW,但时间会很短。
  2. 第二个是CMS concurrent mark(并发标记),据统计百分之八十的GC的时间是浪费在这里,因此它把这块最浪费时间的和我们的应用程序同时运行,这是并发标记。就是你一边产生垃圾,我这一边跟着标记但是这个过程是很难完成的。
  3. 所以最后又有一个CMS remark(重新标记)。这又是一个STW。在并发标记过程中产生的那些垃圾在重新给它标记一下,这个时候需要业务线程停一下,时间不长。
  4. 最后是一个concurrent sweep(并发清理)的过程。并发清理也有它的问题,并发清理过程也会产生新的垃圾啊,这个时候的垃圾叫做浮动垃圾,浮动垃圾就得等着下一次CMS再一次运行的过程把它给清理掉。

在第二阶段并发标记是很容易发生错标的,这里使用了著名的三色标记法。

3.6.1 三色标记法

在这里插入图片描述
如果一个对象自己已经完成标记,并且fields都完成了标记,那么这个对象就是黑色的。
如果一个对象自己标记完成,fields还没有标记,那么这个对象就是灰色的。
如果一个对象还没有被GC线程遍历到,那么这个对象是白色的。

因为业务线程是在运行中的,对象的引用有可能会发生变化,比如:
在这里插入图片描述
下一次操作系统调度GC线程进来的时候,B–>D消失,A–>D增加
在这里插入图片描述
这时候就会有问题,本来A已经标记为黑色了,不会去扫子节点,B灰色的,应该去扫子节点,但是指向子节点D的引用消失了,这时D就标记不到,成为了垃圾,这是错误的。所以当一个黑色对象,增加一个新的引用的时候,GC要把这个对象重新变为灰色,这是CMS的解决方案,这种算法叫做incremental update(增量更新)
在这里插入图片描述
CMS是一款低延迟的垃圾回收器,牺牲了一定的吞吐量。

3.7 G1

G1是一款服务端应用使用的垃圾回收器,目标是用在多核、大内存的机器上,它在大多数情况下,可以实现指定的GC暂停时间,同时还能保持较高的吞吐量。

3.7.1 分区

由于堆内存十分巨大,G1采用了分而治之的思想,也就是分区,把内存分为一小块一小块的region,从1M2M最大到32M。每一份region在逻辑上依然属于某一个分代,这个分代分为四种,第一种Old区都是放老对象的、Survivor区放存活对象的、Eden区放新生对象的、Humongous区大对象区域,对象特别大有可能会跨两个region。所以G1的内存模型已经完完全全的和以前的分代模型不一样了。region的角色并不是固定不变的。
在这里插入图片描述

3.7.2 GC

1、YGC
JVM启动时,G1先准备好Eden区,程序在运行过程中不断创建对象到Eden区,当Eden空间耗尽时,G1会启动一次年轻代回收过程。YGC时,会发生STW。需要注意的是,每次GC时,所有的新生代都会被扫描。
特别需要注意的是,根对象有可能在Old区,然后Old区可能也指向Eden区的对象,那么是否扫描新生代还要扫描整个老年代,这显然是不可取的。G1使用RSet来记录并跟踪Region间的对象引用关系,每个Region初始化时,也会初始化一个RSet,RSet记录其它Region指向本Region对象的记录。
在这里插入图片描述
上图中有三个Region,每个Region被分成了多个Card,在不同Region中的Card会相互引用,Region1中的Card中的对象引用了Region2中的Card中的对象,Region3中的Card中的对象引用了Region2中的Card中的对象,所以Region2的RSet记录了这些引用。
如果一个Old区Card中有对象指向新生代,就将它设为Dirty,只需要扫描这些Dirty的就可以了。
2、MixedGC(混合GC)
当堆内存使用达到一定值时,默认45%(-XX:InitiatingHeapOccupancyPercent),就启动了MixedGC,MixedGC即会回收新生代,也会回收部分老年代。MixedGC时和CMS一样也经历了4个阶段:

  • 初始标记 STW
  • 并发标记(三色标记法)
  • 重新标记 STW
  • 筛选回收 STW (并行)

初始标记时,会触发一次YGC。
并发标记时,会计算每个Region的对象活性,也就是存活对象的比例。
重新标记时,使用了效率更高的SATB算法,不同于CMS的增量更新。
筛选回收时,不会回收整个Old区,而是根据Region的对象活性,从中挑选几个回收价值高的Region进行回收,尽可能达到指定的GC暂停时间(-XX:MaxGCPauseMillis)。也就是说,如果GC指定暂停时间设置的比较少,那么从Old回收的Region就会比较少。

3、FGC
G1的设计初衷就是为了避免FullGC的出现,如果出现了FullGC,可以从下面两点调整:

  • 扩内存
  • 降低MixedGC触发的阈值,让MixedGC提早发生(默认是45%)

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

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

相关文章

智能井盖传感器怎么监测井盖出现倾斜?

智能井盖传感器是一种先进的智能设备,能够二十四小时连续监测井盖是否出现倾斜。其工作原理主要是依靠内置的传感器,以及搭载的MEMS“芯”技术。便于智能井盖传感器实时感知到井盖的姿态变化,一旦发现有倾斜的现象,就会立即向运维…

LeetCode2514.统计同位异构字符串数目

题目简单,关键是灵茶山艾府的代码写起来太优美,不得不记录一下 const int Mod 1e97; using ll long long; ll qmi(ll a,ll b,ll mod){ll res 1;while(b){if(b&1)res res*a%mod;aa*a%mod;b>>1;}return res; }class Solution { public:int c…

计算机毕业设计 基于PHP的考研互助交流系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

WMS仓储管理系统的实施流程是什么

WMS仓储管理系统是现代企业不可或缺的重要工具,它可以有效地优化仓库管理,提高工作效率,减少误差。但是,实施WMS仓储管理系统并不是一件轻松的事情,需要经过一系列的步骤来确保其成功实施。本文将详细介绍WMS仓储管理系…

什么是主机安全,有什么作用?

当今数字化时代,网络安全威胁和风险日益突出,已成为企业面临的重大安全挑战。网络攻击者不断尝试利用各种技术和手段对企业网络资源进行探测和攻击,如:利用漏洞、木马、钓鱼、勒索等方式窃取数据、破坏系统、篡改信息。因此&#…

泛微OA对接金蝶云星空方案分享(对接场景解析)

分享金蝶云星空跟泛微OA系统集成对接的方案分享,主讲审批流程对接,表单对接的两类场景。分别是金蝶云星空发起申请和泛微发起流程审批,最终实现统一管理。 数据集成主要有以下好处: (1)数据一致性&#xf…

为啥网络安全缺口这么大,还是这么缺网络安全工程师?(网络安全行业前景到底如何)

为啥网安领域缺口多达300多万人,但网安工程师也就是白帽黑客却很少,难道又是砖家在忽悠人? 原因主要为这三点: 首先是学校的原因,很多学校网络安全课程用的还都是十年前的老教材,教学脱离社会需求,实操技能…

jdk动态代理和CGLIBE代理

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 使用jdk的反射机制,创建对象的能力&…

Android中使用Google Map

在app的使用过程中,我们经常会跟地图进行交互,如果是海外的应用,那选择使用Google Map 是最合适的选择。 在Android中如何使用Google Map,这里做一个简要的说明。 Google API_KEY的申请 Google Map 的使用并不是免费的&#xf…

【数据库】物理操作的一趟扫描算法机制原理,理解关系代数据与物理计划的关系,以及代价评估的应用和算法优化

一趟扫描算法 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新…

element table滚动到底部加载数据(vue3)

效果图 使用插件el-table-infinite-scroll npm install --save el-table-infinite-scroll局部导入 <template><div class"projectTableClass"><el-table v-el-table-infinite-scroll"load"></el-table></div> </temp…

企业微信应用文本消息

应用支持推送文本、图片、视频、文件、图文等类型&#xff0c;本篇主要实现发送应用文本消息。 获取企业凭证 发送应用消息首先需要获取调用凭证access_token&#xff0c;此处的凭证为企业凭证&#xff0c;可通过企业授权安装时返回的授权信息中获取access_token&#xff1b;之…

数据科学新招:Python揭秘Prometheus接口

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在现代云原生应用的监控体系中&#xff0c;Prometheus无疑是一颗璀璨的明星&#xff0c;而Python则是一门多才多艺的编程语言。将它们结合&#xff0c;通过Python读取Prometheus接口数据&#xff0c;成为了实时监…

【内网安全】搭建网络拓扑,CS内网横向移动实验

文章目录 搭建网络拓扑 ☁环境CS搭建,木马生成上传一句话&#xff0c;获取WebShellCS上线reGeorg搭建代理&#xff0c;访问内网域控IIS提权信息收集横向移动 实验拓扑结构如下&#xff1a; 搭建网络拓扑 ☁ 环境 **攻击者win10地址&#xff1a;**192.168.8.3 dmz win7地址&…

【IEEE出版】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 进入21世纪以来&#xff0c;计算机技术的高速发展带来了消费电子产品的快速更迭。在技术迅速发展历…

多模态大模型总结2(主要2023年)

LLaVA-V1&#xff08;2023/04&#xff09; 论文&#xff1a;Visual Instruction Tuning 网络结构 如下图 所示为 LLaVA-v1 的模型结构&#xff0c;可以看出其简化了很多&#xff0c;但整体来说还是由三个组件构成&#xff1a; Vision Encoder&#xff1a;和 Flamingo 模型的 V…

vsphere系列 :虚拟机配置直通GPU后,启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案

vsphere中的虚拟机配置直通GPU后&#xff0c;启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案 vsphere中的虚拟机配置直通GPU后&#xff0c;启动时出现 模块“DevicePowerOn”打开电源失败 的解决方案1、虚拟机配置GPU直通1、打开虚拟机选项2、点击编辑配置3、添加如…

SpringMVC—拦截器

1 拦截器概念 1.1 简介 拦截器是一种动态拦截方法调用的机制&#xff0c;在 SpringMVC 中动态拦截控制器方法的执行 【注】拦截器底层实现为AOP 作用&#xff1a; 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行 1.2 拦截器和过滤器的区别 ① 归属不同&#…

单片非晶磁性测量系统非晶特性

1. 非晶特性&#xff08;与硅钢相比&#xff09; 非晶带材的厚度很薄&#xff0c;一般为0.025 mm&#xff0c;只有取向硅钢带材的1/10左右。比总损耗很低&#xff0c;P1.5 / 50的典型值约为0.2 W/kg&#xff0c;该值是取向硅钢P1.7 / 50典型值的1/5左右。具有高磁致伸缩和低的…

JavaScript基础—函数、参数、返回值、作用域、变量、匿名函数、综合案例—转换时间,逻辑中断,转换为Boolean型

版本说明 当前版本号[20231129]。 版本修改说明20231126初版20231129完善部分内容 目录 文章目录 版本说明目录JavaScript 基础 - 第4天笔记函数声明和调用声明&#xff08;定义&#xff09;调用细节补充 参数形参和实参函数默认值 返回值作用域全局作用域局部作用域 变量全…