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

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.mzph.cn/bicheng/699.shtml

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

相关文章

java实现chatGPT SDK

搭建一个 ChatGPT-SDK 组件工程,专门用于封装对 OpenAI 接口的使用。由于 OpenAI 接口本身较多,并有各类配置的设置,所以开发一个共用的 SDK 组件,更合适我们在各类工程中扩展使用 整个流程为:以会话模型为出口&#x…

C++笔试强训day3

目录 1.简写单词 2.dd爱框框 3.除2! 1.简写单词 链接 我的思路超级简单,就是将输入的每个string存入vector,然后遍历每个string的第一个元素,如果为小写字母,就-32存入,若为大写,则直接存入。…

Docker in Docker的原理与实战

Docker in Docker(简称DinD)是一种在Docker容器内部运行另一个Docker实例的技术。这种技术允许用户在一个隔离的Docker容器中创建、管理和运行其他Docker容器,从而提供了更灵活和可控的部署选项。以下是DinD的主要特点: 隔离性&am…

Maven实战—搭建微服务 Maven 工程架构

需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。 项目架构: 用户服务:负责处理用户相关的逻辑,例如用户信息的管理、用户注册、登录等。订单服务:负责处理订单相关的逻辑…

使用示例解释.NET中的Mocking是什么?

让我们踏上探索.NET软件开发中Mocking概念的旅程,让我们深入了解Mocking是多么简单易懂、易于访问。请与我一起穿越这个主题,我将涵盖以下内容: 理解Mocking:为何它对于构建强大的测试策略至关重要。探索一些最常见的Mocking库&a…

Ansible组件说明

1.Ansible Inventory 工作当中有不同的业务主机,我们需要在把这些机器信息存放在inventory里面,ansible默认的inventory的文件是/etc/ansible/hosts,也可以通过ANSIBLE_HOSTS环境变量来指定或者运行ansible和ansible-playbook的时候用-i参数临…

视频教程下载:用ChatGPT玩转海外抖音TikTok

CHATGPT for TikTok是一门前沿课程,旨在帮助您充分发挥TikTok广告活动的全部潜力。随着数字营销的爆炸性增长,企业需要使用先进的工具来保持竞争优势。在这门课程中,您将学习如何利用CHATGPT——一种先进的人工智能工具——来创建与目标受众产…

有没有手机上使用的库存软件

库存软件是一种仓库的信息管理系统,它主要针对出库与入库这些数据进行管理,传统的库存管理都是在电脑上安装一个专门的数据库管理系统进行管理,这也是一种比较成熟的管理方式,那么有没有手机上使用的库存软件。 手机上使用的库存软…

k8s配置configmap指定到容器的指定文件

我们需要将名称为walletkey.properties的文件做成configmap,然后将walletkey.properties文件单独挂载出来到/data/walletkey.properties,且不能覆盖/data目录,具体如下 1、创建configmap configmap文件内容 其中walletkey.properties: >-引…

python语言零基础入门——注释、print()函数、input()函数

目录 一、注释 1.块注释 2.行内注释 3.多行注释 二、打印变量 1.print()函数:输出/打印指定内容 2.input()函数:输入指定内容 三、编程题:个人名片 一、注释 1.块注释 以#开始,直到本行结束都是注释为了保证代码的可读性…

科技的崛起:国内机器视觉蓬勃发展

文 | BFT机器人 在工业4.0的浪潮下,随着科技的蓬勃发展,机器视觉逐渐走入大众视野,机器视觉产品的普及范围也越来越广。 大家知道机器视觉的由来吗? 机器视觉的由来可以追溯到20世纪70年代,美国麻省理工学院&#xff…

机器学习鸢尾花各种模型准确率对比

流程 获取数据集导入需要的包读取数据划分训练集和测试集调用各种模型比较准确率 获取数据集 链接:https://pan.baidu.com/s/1RzZyXsaiJB3e611itF466Q?pwdj484 提取码:j484 --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd impo…

华为机考入门python3--(17)牛客17- 坐标移动

分类:字符串 知识点: 正则匹配 re.match(pattern, move) 格式字符串,可以在字符串中直接引用变量 f"{x},{y}" 题目来自【牛客】 import re def is_valid_coordinate(move): # 使用正则表达式验证移动是否合法 # ^: …

施耐德 PLC 及模块 ModbusTCP 通信配置方法

1. 通过【I/O扫描器】服务进行读写 相关文档:各模块说明书仅 NOE 网卡模块、部分 CPU 自带的网口支持 优点:不需要额外编程,系统自动周期型读写数据缺点:扫描周期不定,程序无法控制数据刷新的时序 2. 通过内部程序…

java扩展jmeter依赖

前置条件 创建一个maven项目&#xff0c; 引入依赖 <dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>3.2</version> </dependency> <dependency><groupId&g…

NIO学习

文章目录 前言一、主要模块二、使用步骤1.服务器端2.客户端 三、NIO零拷贝(推荐)四、NIO另一种copy总结 前言 NIO是JDK1.4版本带来的功能,区别于以往的BIO编程,同步非阻塞极大的节省资源开销&#xff0c;避免了线程切换和上下文切换带来的资源浪费。 一、主要模块 Selector&a…

【Linux学习】Linux编辑器-vim使用

这里写目录标题 1. &#x1f320;vim的基本概念&#x1f320;2. vim的基本操作&#x1f320;3.vim异常处理&#x1f320;4. vim正常模式的相关命令&#x1f320;5. vim末&#xff08;底&#xff09;行模式相关命令 vi/vim都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本…

达梦数据库一体机树立金融解决方案标杆

达梦数据库一体机自问世以来&#xff0c;获得众多行业用户的高度关注&#xff0c;并率先在金融行业吹响冲锋号角&#xff0c;实现多个重大项目的落地应用。近日&#xff0c;珠海华润银行股份有限公司基于达梦数据库一体机 I 系列的《数据库一体机银行多业务系统集中部署解决方案…

(保姆级教学)跨站请求伪造漏洞

1. CSRF漏洞 CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为One Click Attack 或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&…

数据结构和算法:动态规划

初探动态规划 动态规划&#xff08;dynamic programming&#xff09;是一个重要的算法范式&#xff0c;它将一个问题分解为一系列更小的子问题&#xff0c;并通过存储子问题的解来避免重复计算&#xff0c;从而大幅提升时间效率。 例题&#xff1a;爬楼梯 给定一个共有 &…