JVM垃圾收集器-serial.parNew,parallelScavnge,serialOld,parallelOld,CMS,G1

news2024/11/20 7:26:00

垃圾收集器
分代模型
适用于新生代:
serial
parNew
parallel Scaavenge

适用于老年代:
CMS
serial Old(msc)
paraller Old

分区模型
适用于超大容量:
G1
在这里插入图片描述

分代模型

serial /serial Old收集器

1.单线程收集器
2.收集时会暂停其他线程(用户体验不好)
3.新生代是复制算法,老年代是标记整理算法
4.参数配置

-XX: +UseSerialGC  #新生代使用serial收集器
-XX: +UseSerialOldGC  #老年代使用serial收集器

优点:
1.简单高效,无其他线程的开销
2.对于多核cpu,依旧采用单线程,浪费cpu资源

在这里插入图片描述

parNew 收集器

1.serial 收集器的多线程版本
2.线程数与cpu 核数相关
3.参数设置

-XX: +UseParNewGC 

4.搭配CMS收集器使用
在这里插入图片描述

parallel Scavenge/parallelOld 收集器

1.关注的是吞吐量,使更高效的利用CPU,
3.参数配置

-XX +UseParallelGC
-XX +UseParallelOldGC

在这里插入图片描述

CMS收集器(重点)(低停顿)(标记清除算法)

1.采用标记清除算法
2.只能使用在老年代
3.尽量减少停顿时间(低停顿

垃圾清理过程:
1.初始标记:该阶段会暂停其他线程,标记初与GCroot 根 直接 关联的对象,其余可达对象不会被标记
2.并发标记:标记出GCroot 根所有的可达对象(耗时长,占整个收集的80%时间,但是和用户线程一起执行)
3.重新标记:该阶段会暂停其他线程,将 并发标记时 新产生的对象进行标记
4.并发清理:将对象进行清除

缺点:
1.并发标记和并发清除时,会和用户线程抢夺cpu资源
2.在并发清理时:会有用户线程产生新的垃圾,这些垃圾不会被回收
3.采用 标记清除算法,会产生不连续的碎片(补救办法:通过参数-XX +UseCMSCompactAtFullCollection 设置清除完后进行整理)
4.时间不确定性,在一次没收集完后,直接进入下一次收集,导致收集失败,(补救办法:使用serial Old收集器,但会产生停顿)

参数配置
设置线程数,设置是否做整理以及fullGC多少次后做整理,设置fullGC之前是否再来一次minorGC来减少标记时开销

-XX: +UseConcMarkSweepGC #使用收集器
-XX: ConcGCThreads #并发GC线程数
-XX: +UseCMSCompactAtFullCollection  # FUllGC后是否做整理
-XX: CMSFullGCsBeroreCompaction     # 多少次FUllGC后做整理,默认是0,代表每次都做整理
-XX: CMSInitatingOccupancyFraction  #设置老年代的使用到多少时,会触发FullGC
-XX:+UseCMSInitatingOccupancyOnly #设置回收阀值,不指定的话,除了第一次外,之后jvm会自动调整
-XX: +CMSSvacavengeBeroreRemark #在FullGC之前,进行minorGC 目的是通过减少对象引用,减少标记阶段的开销

在这里插入图片描述

分区模型

G1收集器(面向大容量)(筛选回收)(复制算法)

大容量:指的是给堆内存分配十几个G以上

1.将堆区分成多个区(最多可以有2048个区,每个区的大小是堆内存/2048),且每个区可以是任意年轻代,老年代。
2.年轻代默认占比是整个堆区的5%(可以通过参数配置,但不能超过60%)
3.Humongous 区:大对象区,将超过一个区的50%,就会直接放到大对象区,大对象区在FullGC的时候进行回收
优点:避免大对象进入老年代,占用老年代的空间而触发FullGC。

垃圾收集过程:
1.初始标记:标记GCroot根直接关联的对象
2.并发标记:标记GCroot根可达到的所有对象
3.最终标记:将有变动的对象进行再次标记
4.筛选回收:通过设置回收时间-XX : MaxGCPauseMillis #指定回收时间 ,默认200ms,堆区的回收价值和成本进行排序,然后在设定的时间内回收
5.复制算法:将每个区存活对象,复制到空白区。

收集器分类:
1.youngGC
当Eden区满了后,计算回收当前Eden区需要多长时间,然后与设置的回收时间比较 -XX : MaxGCPauseMillis 若是远远小于,则对新生代进行扩容(增加区),若接近,则进行youngGC

2.mixedGC
老年代占用整个堆区的设定的值-XX:InitiatingHeapOccupancyPrencet 的值,会进行mixedGC,进行时会将部分年轻代,部分老年代,部分大对象区进行回收

3.FullGC
对象在复制的时候,空白的区放不下存活的对象,就会触发FullGC,采用单线程回收,标记清除,整理对象,会停止用户线程

在这里插入图片描述

ZGC收集器

JDK11 推出的低延迟收集器 (10ms)

堆区的划分

将堆区分为小页面,中页面,大页面
Small Region:2MB,主要用于放置小于 256 KB 的小对象。
Medium Region:32MB,主要用于放置大于等于 256 KB 小于 4 MB 的对象。
Large Region:N * 2MB。这个类型的 Region 是可以动态变化的,不过必须是 2MB 的整数倍,最小支持 4 MB。每个 Large Region 只放置一个大对象,并且是不会被重分配的。
在这里插入图片描述

安全点

JVM进行检查,业务线程没有对象的创建和引用的改变,就可以进行STW

判断垃圾的方式

传统垃圾收集器,使用可达性分析,GC 信息保存在对象头的 Mark Word 中,回收时需要进行对象遍历,查看对象头

ZGC:着色指针

着色指针

在 64 位的指针上,高 16 位都是 0,暂时不用来寻址。剩下的 48 位支持的内存可以达到 256 TB(2 ^48),这可以满足多数大型服务器的需要了。不过 ZGC 并没有把 48 位都用来保存对象信息,而是用高 4 位保存了四个标志位,这样 ZGC 可以管理的最大内存可以达到 16 TB(2 ^ 44)

JVM 可以从指针上直接看到对象的三色标记状态(Marked0、Marked1)、是否进入了重分配集(Remapped)、是否需要通过 finalize 方法来访问到(Finalizable)
在这里插入图片描述

标记垃圾的方式:着色指针
在这里插入图片描述

GC过程

1.初始标记
将GCroots 根直接关联的对象进行标记(会进行STW)

2.并发标记

3.再标记

4.并发转移准备

5.初始转移

6.并发转移

在这里插入图片描述

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

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

相关文章

java学习之路-程序逻辑控制

目录 1.分支结构 1.1 if语句 栗子 判断奇数还是偶数 判断一个年份是否为闰年 1.2switch语句 栗子 2. 循环结构 2.1while 循环 栗子 2.2break和continue break continue 2.3for循环 基本语法 栗子 2.4 do while 循环 3.输入输出 3.1输出 3.2从键盘输入 栗子…

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波。 基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步: 检测边缘,发现可能…

2024年初中生古诗文大会备考:多选题真题和独家解析(持续更新)

今天我们继续来做初中古诗文大会的一道难题:多选题,让大家了解初中生古诗文大会的考察内容和形式,并且提供了我独家的题目解析和答案,供初中的同学们学习和参考。 Tips:古诗文大会的许多题目都来自于中考、高考&#…

【Twinmotion】Twinmotion导入UE5

步骤 1. 在虚幻商城中安装“Datasmith Twinmotion导入器插件” 安装“面向虚幻引擎的Twinmotion内容” 2. 打开虚幻引擎,在插件中搜索“twinmotion”,勾选如下两个插件,然后重启虚幻引擎 3. 打开Twinmotion,随便添加一个物体 导出…

html canvas怎么在图片上面加文字

在HTML canvas中,要让文字显示在图片上方,你需要按照以下步骤操作: 首先,使用drawImage()方法将图片绘制到canvas上。 然后,使用fillText()或strokeText()方法在canvas上绘制文本。 以下是一个简单的示例代码&#…

Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

📁 前情提要: Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ① 目录 一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 & 分页 & 排序 1.2、单条件查询…

C++第五弹---类与对象(二)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 类与对象 1、类对象模型 1.1、如何计算类对象的大小 1.2、类对象的存储方式猜测 1.3、结构体内存对齐规则 2、this指针 2.1、this指针的引出 2.2…

Android U pipeline-statusbar

Android U - statusbar pipeline 写在前面 Android原生从T开始对SystemUI进行MVVM改造,U上状态栏部分进行了修改;第一次出现修改不会删除原有逻辑,而是两版并行,留给其他开发者适配的时间;在下一个大版本可能会删除原…

flask库

文章目录 flask库1. 基本使用2. 路由路径和路由参数3. 请求跳转和请求参数4. 模板渲染1. 模板变量2. 过滤器3. 测试器 5. 钩子函数与响应对象 flask库 flask是python编写的轻量级框架,提供Werkzeug(WSGI工具集)和jinjia2(渲染模板…

SpringBoot+Vue.js协同过滤算法美食推荐小程序

摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的,所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套协同过滤算法美食推荐小程序,帮助…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法,如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

SimpleDateFormat类 --java学习笔记

SimpleDateFormat 代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式 常见构造器和方法: pattern 代表需要应用的时间格式—— 时间格式的常见符号: 时间格式的应用举例: import java.text.SimpleDate…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列)简称MQ,是一种应用程序对应用程序的消息通信机制。在MQ中,消息以队列形式存储,以便于异步传输,在MQ中,发布者(生产者)将消息放入队列&#xff…

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法,它将一个信号分解为多个模态叠加的形式,进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换,小波变换)不同&…

最后十几天!未备案小程序将会被清退

微信官方通知 2023年8月9日,微信公众平台发布了“关于开展微信小程序备案的通知”: 去年就已经在逐步推进备案了,新注册小程序必须备案才可以上架。若微信小程序已上架,须于2024年3月31日前完成备案,逾期未完成备案&a…

苹果大模型MM1强势来袭!300亿参数所向披靡

功能展示 左图问:图片中有多少个苹果? 苹果大模型答:7个 左图问:这些州中哪一个是最北的? 回答:Delaware 追问:其他的州是什么? 回答:Arizona, Oklahoma, North Caro…

Ant Design Pro complete版本的下载及运行

前言 complete 版本提供了很多基础、美观的页面和组件,对于前端不太熟练的小白十分友好,可以直接套用或者修改提供的代码完成自己的页面开发,简直不要太爽。故记录一些下载的步骤。 环境 E:\code>npm -v 9.8.1E:\code>node -v v18.1…

[HTML]Web前端开发技术24(HTML5、CSS3、JavaScript )JavaScript基础JavaScript,Netscape,事件处理代码,外部JS——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

Java学习笔记(12)

包 导包 Final 不能被改变的,修饰方法 类 变量 方法不能被重写 类不能被继承 变量,赋值一次,变成常量,不能再被赋值 final修饰引用数据类型,地址值不能变,里面的内容可以变 字符串是不可变的 源码中使…

ubuntu(20.04)-安装JAVA环境-IDEA

1.下载IDEA 2.解压文件 sudo tar -zxvf idealC-2022.2.3.tar.gz -C /opt 3.添加环境变量: .vim ~/.bashrc export IDEA_HOME/opt/ideaIC-2022.2.3/ export PATH${IDEA_HOME}/bin:$PATH source ~/.bashrc 4.启动: cd /opt/ideaIC-2…