深入理解JAVA垃圾收集器CMS,G1工作流程原理 GC流程图 什么社会触发Minor GC?触发MinorGC过程。Full GC 过程。

news2025/1/16 0:49:14

java CMS,G1垃圾收集器工作流程原理浅析

JVM内存空间基础知识点(基于JDk1.8)
1.方法区:逻辑概念,元空间,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
2.程序计数器:程序计数器可以看作当前线程所执行的字节码的行号指示器。如果线程执行的是Java方法那么这个计数器记录的是正在执行的虚拟机字节码指令地址。如果执行的是Native方法,这个计数器为空。
2.Java虚拟机栈:Java虚拟机栈跟程序计数器一样是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。
3.本地方法栈:本地方法栈与虚拟机栈作用相似,它们之间的区别是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。
4.Java堆: Java堆通常是Java虚拟机所管理的内存中最大的一块。Java堆是被锁有线程共享的一块内存区域,在虚拟机启动时创建。这块区域唯一的目的就是存放对象实例,几乎所有对象实例都在该区域分配内存。

Java堆时垃圾收集器管理的主要区域(GC堆),从内存回收的角度(收集器一般采用分代收集算法),Java堆还可以细分为:新生代和老年代。新生代再细分有:Eden空间、From Survivor空间、To Survivor空间。

在这里插入图片描述

1)简述垃圾收集算法

1.标记-清除算法:

两遍扫描,第一遍扫描枚举GCRoots根节点对象标记出不可回收对象,第二遍扫描找到可回收对象进行清理。算法简单,存活对象较多的情况下效率比较高,但是容易产生一个内存碎片化的问题。

2.复制算法:

一次扫描找到存活对象进行复制,效率较高。适用于存活对象较少的情况,新生代垃圾收集(新生代对象存活率百分之二)。但是对内存要求较高,一半的内存空间预留。

3.标记-整理算法:

两遍扫描找到存活对象并进行移动整理。内存不会造成浪费,但是回收效率较低。

4.分代收集算法:前几种算法的组合

2)垃圾收集器介绍

在这里插入图片描述

1.serial系列(标记整理算法)

serial-serialold组合,单线程垃圾收集器,GC线程工作的时候会暂停所有用户线程,产生stop the world。适用于内存较小的内存垃圾回收,简单而高效,不存在多线程交互开销,效率高。一般是硬件能力不足的情况下推动产生的。
在这里插入图片描述

2.Parallel系列(标记整理算法)

Parallel 并行线程垃圾收集器,GC线程工作的时候暂停用户线程,产生stop the world。内存较大时,单线程GC工作时造成的stop the world时间过长,影响用户体验。Parallel系列垃圾收集器GC线程并行清理,减少gc工作线程时间。
在这里插入图片描述

3.CMS垃圾收集器。重点(垃圾清除算法)

在这里插入图片描述
CMS垃圾收集器工作流程
1.初始标记:枚举GCRoots对象,暂停用户线程,扫描对象较少,Stop the world时间短。
2.并发标记:GC线程,用户线程并发工作,耗时时间最久的一部分内容(80%GC时间),GC线程抢占CPU,对用户线程有影响。由于用户线程是并发执行的,用户线程会造成一些对象的引用改变,产生新的垃圾对象。
3.重新标记:短暂的stop the world,不会有对象的状态改变。并发标记产生的新的垃圾会在这阶段被标记出来。
4.并发清理: GC线程和用户线程并发执行,产生的浮动垃圾由下一次垃圾回收清理。
缺点:CMS进行垃圾收集的时候需要预留一定的内存空间给用户线程工作(默认68%,可设置),在内容空间不足时,会导致回收失败,此时会通过serialold进行垃圾回收,速度特别慢。

CMS垃圾收集器采用的是三色标记算法。
在这里插入图片描述
由于CMS采用的是并发标记,在GC线程工作时,此时有一个黑色的对象的引用对象被置为null,由于黑色对象不需要再被重新扫描,此时又没有其他引用跟置为null的引用对象产生关联时。就会产生一个浮动垃圾的情况。
在一个灰色对象的引用白色对象引用被置为null,并将黑色对象的属性引用指向该白色对象时,会产生一个漏标现象。CMS采用三色标记法+incremental update算法,在黑色对象引用增加时,将黑色引用对象置为灰色,下次重新扫描。

4.G1垃圾收集器。重点,(region内标记清楚算法,region之间复制算法)

G1逻辑分代概念。基于整个内存划分为四个不同类型的内存区域。
H:存放大对象


每个region都有一个RememberrdSet内存区域 记录了其他region到benregion的引用,垃圾收集器只需扫描该区域即可。
G1分为YGC(新生代回收),FGC(整个堆内存回收),MixedGC(可设置MixedGC启动的内存大小)
MixedGC类似于CMS,在堆内存空间使用超过45%时,产生MixedGC。G1采用三色标记法+SATB算法,在灰色对象的白色引用对象引用清楚时,置入堆栈对象引用,后续扫描RSet枚举根对象判断是有有新的引用指向该白色对象。没有则进行清楚。

CMS垃圾清理流程图 及 具体逻辑

1、新创建的对象一般会被分配在新生代中。常用的新生代的垃圾回收器是 ParNew 垃圾回收器,它按照 8:1:1 将新生代分成 Eden 区,以及两个 survivor 区。创建的对象将 Eden 区全部挤满,这个对象就是「挤满新生代的最后一个对象」。此时,Minor Gc 就触发了。
2、在正式 Minor Gc 前,JVM 会先检查新生代中对象,是比老年代中剩余空间大还是小。Minor Gc 之后 survivor 区不放剩余对象,这些对象就要进入到老年代,所以要提前检查老年代是不是够用。
3、老年代剩余空间如果大于新生代中的对象大小,那就直接 Minor Gc,Gc 完survivor 不够放,老年代够放。
老年代剩余空间如果小于新生代中的对象大小,这时候就要进入老年代空间分配担保规则。
4、老年代空间分配担保规则:如果老年代中剩余空间大小,大于历次 Minor Gc 之后剩余对象的大小,那就允许进行 Minor Gc。因为从概率上来说,以前的放的下,这次的也应该放的下。那就有两种情况:
一:老年代中剩余空间大小,大于历次 Minor Gc 之后剩余对象的大小,进行 Minor Gc
二:老年代中剩余空间大小,小于历次 Minor Gc 之后剩余对象的大小,进行 Ful GC,把老年代空出来再检查。

结合第四步,开启老年代空间分配担保规则只能说是大概率上来说,Minor Gc 剩余后的对象够放到老年代,如果放不下:Minor Gc 后会有这样三种情况:
Minor Gc 之后的对象足够放到 survivor 区,Gc 结束。
Minor Gc 之后的对象不够放到 survivor 区,接着进入到老年代,老年代能放下,那也可以,GC 结束
Minor Gc 之后的对象不够放到 survivor 区,老年代也放不下,那就只能 Full GC。
以上是成功 GC 的例子,以下3 中情况,会导致 GC 失败,报 OOM:
紧接上一节 Ful GC 之后,老年代任然放不下剩余对象,就只能 00M.
未开启老年代分配担保机制,且一次FuI GC 后,老年代任然放不下剩余对象,也只能 OOM。
开启老年代分配担保机制,但是担保不通过,一次Ful GC 后,老年代任然放不下剩余对象,也是能 OOM。
注:
老年代分配担保机制在JDK1.5以及之前版本中默认是关闭的,需要通过HandlePromotionFailure手动指定,JDK1.6之后就默认开启。如果我们生产环境服务使用的是JDK/1.7JDK1.8,所以不用再手动去开启担保机制。
Full GC主要指新生代、老年代、metaspace上的全部GC

使用G1垃圾回收器的例子
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

UE4_动画基础_根运动Root Motion

学习笔记,仅供参考! 在游戏动画中,角色的碰撞胶囊体(或其他形状)通常由控制器驱动通过场景。然后来自该胶囊体的数据用于驱动动画。例如,如果胶囊体在向前移动,系统就会知道在角色上播放一个跑步…

C#语法知识之循环语句

5、循环语句 文章目录 1、while思考1 斐波那契数列思考2 判断一个数是否为质数思考3 找出100以内的质数 2、do...while3、for思考1 找水仙花数思考2 乘法表 1、while 1、作用 让代码重复去执行 2、语法相关 while(bool类型值){//当满足条件时,就会执行while语句…

深度学习每周学习总结P5(运动鞋识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分2. 加载数据集3.模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参…

深度强化学习开端——DQN算法求解车杆游戏

深度强化学习开端——DQN算法求解车杆游戏 DQN,即深度Q网络(Deep Q-Network),是一种结合了深度学习和强化学习的算法,其主要用于解决序列决策问题,并且在许多复杂的决策任务中展现出了显著的效果。DQN算法…

C++:map和set的使用

一、关联式容器介绍 在学习map和set之前,我们接触到的容器有:vector、list、stack、queue、priority_queue、array,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。 关联式容器也是用…

【JavaEE多线程】线程中断 interrupt()

系列文章目录 🌈座右铭🌈:人的一生这么长、你凭什么用短短的几年去衡量自己的一生! 💕个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️:清灵白羽 漾情天…

用FRP配置toml文件搭建内网穿透

需求场景 1、一台外网可访问的有固定ip的云服务器,Ubuntu系统 2、一台外网无法访问的无固定ip的本地家用电脑,Ubuntu系统 需求:将云服务器搭建为一台内网穿透服务器,实现通过外网访问家用电脑(网页)的功能。…

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

AWS账号注册以及Claude 3 模型使用教程!

哈喽哈喽大家好呀,伙伴们!你听说了吗?最近AWS托管了大热模型:Claude 3 Opus!想要一探究竟吗?那就赶紧来注册AWS账号吧!别担心,现在注册还免费呢!而且在AWS上还有更多的大…

macos知名的清理软件 cleanmymac和腾讯柠檬哪个好 cleanmymacx有必要买吗

MacOS是一款优秀的操作系统,但是随着使用时间的增加,它也会产生一些不必要的垃圾文件,占用磁盘空间和内存资源,影响系统的性能和稳定性。为了保持MacOS的清洁和高效,我们需要使用一些专业的清理软件来定期扫描和清除这…

DePIN 赛道黑马,peaq network 如何打造全新 Web3 物联网?

当 Web2 公司仍对用户数据和资料进行“中心化”的收集与控制时,我们虽享受到了物联网技术的便利,却依旧没有逃脱个人数据和价值所有权的剥夺。由此,Web3 技术开始深入物联网世界,智能家居、智能汽车、智能手机都成为重要发力点&am…

三大层次学习企业架构框架TOGAF

前言 对于一名架构师来讲,如果说编程语言是知识库层次中的入门石,那么企业架构框架则相当于知识库层次中的金字塔尖。如果想成长为企业级的架构师,企业架构框架是必须要攀登的高塔。 目前国内绝大多数企业采用TOGAF标准,因此我们…

XSS漏洞---类型+实战案例+防止

文章目录 目录 文章目录 一.XSS漏洞简介 二.XSS漏洞类型 三.实战案例 反射型XSS 存储型XSS 四.防护措施 一.XSS漏洞简介 XSS漏洞(Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者在受害者的浏览器中注入恶意脚本。当受…

记录一下flume中因为taildir_position.json因位置不对导致数据无法从kafka被采到hdfs上的问题

【背景说明】 我需要用flume将kafka上的数据采集到hdfs上,发现数据怎么到不了hdfs。 【问题排查】 1.kafka上已有相应的数据 2.我的flume配置文档(没问题), 3.时间拦截器(没问题), 4.JSONObje…

IDEA开启自动导包,自动删包

找到file----------->Settings选项 找到Editor-------->General------------>Auto Import选项 勾选两个选项,在点击Apply,在点击ok 最后就ok了

记录——FPGA的学习路线

文章目录 一、前言二、编程语言2.1 书籍2.2 刷题网站2.3 仿真工具 三、基础知识3.1 专业基础课3.2 fpga相关专业知识 四、开发工具五、动手实验 一、前言 也不是心血来潮想学习fpga了,而是祥哥还有我一个国科大的同学都在往fpga这个方向走 并且看过我之前文章的同…

基于SSH的通讯录管理系统

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSH的通讯录管理系统拥有两种角色:管理员和用户 管理员:用户管理、公告管理、系别管理、班级管理、通讯信息管理等 用户:拥有管理员中的查看功能…

数据可视化(五):Pandas高级统计——函数映射、数据结构、分组聚合等问题解决,能否成为你的工作备用锦囊?

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

Vast+产品展厅 | Vastbase G100数据库是什么架构?(1)

Vastbase G100是海量数据融合了多年对各行业应用场景的深入理解,基于openGauss内核开发的企业级关系型数据库。 了解Vastbase G100的架构,可以帮助您确保数据库系统的高效、可靠和安全运行。 “Vast产品展厅”将分两期,为您详细讲解Vastbas…

创新指南|利用 AI 工具转变您的内容策略

内容策略涉及规划、创建和管理内容。无论您是在策划博客文章、社交媒体更新还是网站内容,精心制定的内容策略是营销活动成功的关键。然而,如果没有合适的工具,维持强大的内容策略可能会具有挑战性。这就是人工智能(AI) 工具发挥作用的地方&am…