JVM垃圾回收篇-垃圾回收器

news2024/12/22 23:48:20

JVM垃圾回收篇-垃圾回收器

串行垃圾回收器

Serial串行:为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有用户的线程,所以不适合服务器环境,适用于堆内存小,适合于个人电脑

开启串行垃圾回收

-XX:+UseSerialGC = Serial + SerialOld
  • Serial:开启新生代串行垃圾回收,采用复制算法
  • SerialOld:开启老年代串行垃圾回收,采用标记整理算法

在这里插入图片描述

  • 首先让用户线程到达一个安全点[垃圾回收期间涉及内存地址改变],所有用户线程停止运行,垃圾回收线程对垃圾进行回收,等待垃圾回收完成后,用户线程恢复运行
吞吐量优先的垃圾回收器
  • 多线程

  • 堆内存较大,需要多核cpu支持(否则就是多个线程争抢同一个cpu的时间片段)

  • 单位时间内,stw的时间最短

    0.2 0.2=0.4 一小时内总的stw时间最短,单次较长
    

在这里插入图片描述

开启吞吐量优先的垃圾回收器

-XX:+UseParallelGC ~ -XX:+UseParallelOldGC //开启一个,另一个也会自动开启(jdk1.8默认开启)
  • +UseParallelGC:开启新生代吞吐量优先垃圾回收,采用复制算法

  • +UseParallelOldGC:开启老年代吞吐量优先垃圾回收,采用标记整理算法

  • -XX:ParallelGCThreads=n 设置垃圾回收线程数,如果不设置,默认垃圾回收线程数与CPU核心数保持一致

  • -XX:+UseAdaptiveSizePolicy 根据GC的情况自动计算计算 Eden、From 和 To 区的大小,晋升阈值也会受到影响,jdk1.8默认开启

  • -XX:GCTimeRatio=ratio GC时间占比,ratio默认为99,计算公式:gc时间占比=1/(1+ratio),即默认占比为1/100,相当于100分种垃圾回收时间不大于1分钟,如果大于1分钟,会自动调整堆内存大小,加大堆内存

    heap size++ -> gc count--
    
  • -XX:MaxGCPauseMillis=ms 垃圾回收最大暂停时间

    • 默认200ms,当堆内存增大时,每次gc所需时间也会增大(需要扫描堆中的垃圾,扫描和回收时间都会增大),所以需要保障最大暂停时间意味着heap减小,显然,这与GCTimeRatio相冲突
响应时间优先的垃圾回收器
  • 多线程

  • 堆内存较大,多核cpu场景

  • 尽可能让单次stw的时间最短

    0.1 0.1 0.1 0.1 0.1 =0.5  单次时间最短 总时间较长
    

在这里插入图片描述

  • 开启响应时间优先的垃圾回收器

    -XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld
    
    • UseConcMarkSweepGC(CMS):基于标记清除的垃圾回收器,并且是并发的,工作在老年代
    • UseParNewGC:工作在新生代的垃圾回收器,采用复制算法
    • CMS垃圾回收器并发失败concurrent mode fialure时,会退化为SerialOld垃圾回收器
    • -XX:ParallelGCThreads=n (垃圾回收并行线程数) ~ -XX:ConcGCThreads=threads (垃圾回收并发线程数),并发线程数一般设置为并行线程数的1/4
    • -XX:CMSInitiatingOccupancyFraction=percent 执行cms垃圾回收时的内存占比,假设percent=80,即老年代内存占用到达80%就触发一次内存清理(由于是并发清理,清理期间会产生新的垃圾[浮动垃圾],需要预留空间给这部分垃圾占用)
    • -XX:+CMSScavengeBeforeRemark 在 CMS GC 的重新标记 阶段开始前先使用ParNewGC进行一次 Young GC,有利于减少 Young Gen 对 Old Gen 的无效引用,降低 CMS-remark 阶段的时间开销
存在问题
  • CMS垃圾回收器采用的是标记清除算法,所以会产生内存碎片
  • CMS的GC耗时80%都在remark阶段,remark阶段停顿时间会很长
  • concurrent mode failure:这个异常发生在cms正在回收的时候。执行CMS GC的过程中,同时业务线程也在运行,当年轻代空间满了,执行ygc时,需要将存活的对象放入到老年代,而此时老年代空间不足,这时CMS还没有机会回收老年代产生的,或者在做Minor GC的时候,新生代救助空间放不下,需要放入老年代,而老年代也放不下而产生的
  • promotion failed:在进行Minor GC时,Survivor空间不足,对象只能放入老年代,而此时老年代也放不下造成的,多数是由于老年代有足够的空闲空间,但是由于碎片较多,新生代要转移到老年带的对象比较大,找不到一段连续区域存放这个对象导致的,发生promotion failed的下一步就会产生concurrent mode fialure,将垃圾回收器退化为SerialOld,此时吞吐量下降严重
CMS垃圾回收器的四个阶段**
  • 阶段一(初始标记):标记老年代中所有的根对象,包括根对象直接引用的对象,以及被年轻代中所有存活的对象所引用的老年代对象(只是标记一下GC Roots能直接关联到的对象,速度很快),会触发stw

  • 阶段二(并发标记):从初始标记阶段标记的对象开始找出所有存活的对象

    因为是并发运行的,在运行期间会发生新生代的对象晋升到老年代、或者是直接在老年代分配对象、或者更新老年代对象的引用关系等等,对于这些对象,都是需要进行重新标记的,否则有些对象就会被遗漏,发生漏标的情况。为了提高重新标记的效率,该阶段会把上述对象所在的Card标识为Dirty,后续只需扫描这些Dirty Card的对象,避免扫描整个老年代; 并发标记阶段只负责将引用发生改变的Card标记为Dirty状态,不负责处理

  • 阶段三(重新标记):为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。此阶段也需要stw

  • 阶段四(并发清除):这个阶段主要是清除那些没有标记的对象并且回收空间)

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

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

相关文章

MySQL_多表关系

多表关系 一对一关系 用户和用户详情 关系:一对一的关系 用途:用于单表拆分,将一张表的基础字段放在一张表中,其它字段放在另一张表中,可以提升查询效率 实现:在任意一张表里面添加外键,关联…

《向量数据库指南》——判断一个好的向量数据库,标准是什么?

一个不容忽略的问题是,趁着大模型这波狂热浪潮,软件市场催生了大量的向量数据库,软件质量和性能参差不齐,其中更是不乏套壳的向量数据库。那么,如何区分一个向量数据库是否真正具备自己所需的能力,如何迅速了解并对比不同向量数据库的性能和容量成本差距呢? 不久前,Zil…

【dnf5文档】新一代RedHat自动化包管理器

前言 HI,CSDN的码友们,距离上一次我发文章已经过去了半年的时间,现在我又来介绍自己新发现和探究的开源技术了。计算机的发展总是飞速的,当我在写这篇文章的时候,Fedora rawhide已经进入了40版本、默认采用的自动化包管理器为dnf…

亚马逊推出新卖家论坛!提供多种新功能!

亚马逊欧洲站发布公告称新推出的亚马逊卖家论坛新论坛提供更简单的导航和搜索,高级过滤功能,投票功能以及个性化设置,以下是公告内容: 我们推出了新的亚马逊卖家论坛体验,卖家每天都可以在这里寻找答案,帮…

560. 和为 K 的子数组

思路 本题的主要思路为创建一个哈希表记录每个0~i的和,在遍历这个数组的时候查询有没有sum-k的值在哈希表中,如果有,说明有个位置到当前位置的和为k。   有可能不止一个,哈希表负责记录有几个sum-k,将和记录下来。这…

网络远程USB共享 VirtualHere USB Server v4.5.8 Crack

VirtualHere 允许通过网络远程使用 USB 设备,就像本地连接一样! 传统上,USB 设备需要直接插入计算机才能使用。有了 VirtualHere,这不再是必需的,网络本身变成了传输 USB 信号的电缆(也称为 USB over IP、U…

勘探开发人工智能技术:机器学习(2)

0 提纲 3.1 k k k 近邻算法 3.2 决策树 3.3 k k kMeans 3.4 如何定义机器学习问题 3.5 线性回归 1 k k k 近邻算法 开卷考试, 在桌上堆的资料越多, 越是 “见多识广”. 1.1 核心思想 具有讽刺意味的是: 机器学习最基本的算法居然是不学习, 也称为惰性学习 (lazy learni…

Blazor简单教程(1.1):Razor基础语法

文章目录 前言语法介绍生命C#代码控件绑定简单绑定双向绑定带参数的函数绑定 前言 Blazor最重要的是Razor组件和cshtml页面。两个最大的区别就是cshtml是完整的html,Razor是不完整的html 微软Razor 语法官方文档 我的Blazor基础语法个人总结 语法介绍 生命C#代码控件 code…

Stable Diffusion - 幻想 (Fantasy) 风格与糖果世界 (Candy Land) 的人物图像提示词配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132212193 图像由 DreamShaper8 模型生成,融合糖果世界。 幻想 (Fantasy) 风格图像是一种以想象力为主导的艺术形式,创造了…

UDS诊断笔记

文章目录 常见缩写简介UDS寻址模式1. 物理寻址(点对点、一对一)2. 功能寻址(广播、一对多)3. 功能寻址使用场景举例 UDS报文格式UDS协议栈网络层网络层功能网络层协议1. 单帧 SF(Single Frame)2. 首帧 FC&a…

matplotlib笔记:bar barh

1 bar 绘制垂直方向的条形图 x条形的 x 坐标height 条形的高度 width 条形的宽度 (浮点数或类数组) bottom 条形的底部的 y 坐标 (浮点数或类数组) align 控制条形对齐方式 center:将基线居中于 x 位置。ed…

cpu的cacheline对程序效率影响

什么是cpu cacheline CPU的缓存行(Cache Line)是存储器层次结构中的一部分,用于在CPU缓存和主存之间传输数据。缓存行是缓存的最小单位,也是处理器从主存中读取数据到缓存或将数据从缓存写回主存的最小数据块。 缓存行的大小是由…

C语言 指针与内存之间的关系

一、内存与字节 一个内存单元一个字节一个地址 整型 int 类型中int类型的字节数是4 且一个字节表示八个bite位 一个二进制数位有着32个bite 所以又可以表示为:一个字节 8个比特位 32位数的二进制数位的八分之一 例如: int a 10; 该表达式…

编程基础与脚本规范

编程基础与脚本规范 一.编程基础1.1程序组成1.2.编程风格1.3 编程语言的分类 二.shell脚本基础2.1shell脚本的用途和应用场景2.2常见的shell解释器2.3shell脚本基本结构2.4shell规范脚本2.5脚本的执行方式2.6脚本错误调试 三.重定向与管道符3.1标准输入去输出3.2重定向3.3 管道…

TypeError: Plain typing.NoReturn is not valid as type argument解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C语言】初阶指针详解

目录 一、什么是指针? 1.指针变量 2.指针大小 二、指针类型 三、野指针 四、指针运算 1.指针-整数 2.指针-指针 3.指针的关系运算 五、指针和数组 六、二级指针 七、指针数组 一、什么是指针? 指针是内存中一个最小单元的编号,…

MySQL_数据库的DDL语句(表的创建与修改)

DDL 数据库操作 查看当前有哪些数据库 SHOW databases;#查看哪些数据库查询当前数据库 SELECT database();创建数据库 create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ] ;创建一个sycoder数据库, 使用数据库默认的字符集 CREATE…

retrofit-helper 简洁的封装retrofit,优雅的取消请求

retrofit-helper Retrofit是很多android开发者都在使用的Http请求库!他负责网络请求接口的封装,底层实现是OkHttp,它的一个特点是包含了特别多注解,方便简化你的代码量,CallAdapter.Factory 和Converter.Factory可以很灵活的扩展你的请求。我们在使用的…

“崩溃”漏洞会影响英特尔 CPU 的使用寿命,可能会泄露加密密钥等

对于 CPU 安全漏洞来说,本周是重要的一周。昨天,不同的安全研究人员发布了两个不同漏洞的详细信息,一个影响多代英特尔处理器,另一个影响最新的 AMD CPU。“ Downfall ”和“ Inception ”(分别)是不同的错…

CEC2013(MATLAB):能量谷优化算法EVO求解CEC2013的28个函数

一、能量谷优化算法EVO 能量谷优化算法(Energy valley optimizer,EVO)是MahdiAzizi等人于2023年提出的一种新颖的元启发式算法,其灵感来自关于稳定性和不同粒子衰变模式的物理原理。能量谷优化算法(Energy valley opt…