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

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.hqwc.cn/news/60846.html

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

相关文章

计算机的构造和原理

本资料转载于B站up主芯片超人-花 仅用于学习和讨论,如有侵权请联系 计算机工作原理之3D动画揭秘:计算机内部如何工作_哔哩哔哩_bilibili 1.CPU的部分 1.1 CPU放大看 1.2 一个芯片中,有80亿至100亿晶体管 1.3 放大磁道 1.4 共享3级缓存 1.5 …

无涯教程-Perl - endservent函数

描述 此功能告诉系统您不再期望使用getservent从服务文件中读取条目。 语法 以下是此函数的简单语法- endservent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $aliases, $port_number,$protocol_name)getservent())…

【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

vue2项目搭建全步骤-超级详细

文章目录 环境配置node配置安装Vue CLI ​搭建新项目vue create 搭建新项目方法一:选择第一个就好(Default是自动安装,按下回车键进行选择)方法二:配置自定义设置第一步:选择 Manually select features第二…

比特鹏哥5-数组【自用笔记】

比特鹏哥5-数组【自用笔记】 1.数组的概念2.一维数组的创建和初始化创建的语句结构初始化的语句结构 3.一维数组的使用数组的下标:从0开始,n个数组,最后一个的下标是n-1 4.一维数组在内存中的存储5.sizeof计算数组元素个数可以计算元素个数并…

AtcoderABC223场

A - Exact PriceA - Exact Price 题目大意 高橋的钱包里只有一个或多个100日元硬币,没有其他的东西。现在给定一个金额X,需要判断是否可能存在这样的情况,使得钱包中的总金额是X日元。 思路分析 根据题目要求,钱包中只有100日元…

【Spring security 解决跨域】

security 跨域 概述方案方案一方案二方案三方案四 主页传送门:📀 传送 概述 Spring Security是一个功能强大且高度可定制的,主要负责为Java程序提供声明式的身份验证和访问控制的安全框架。其前身是Acegi Security,后来被收纳为Spring的一个…

栈和队列OJ题讲解

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大家三连关注&…

常见的软件项目质量管理5种方法

产品质量的重要性不言而喻,为了确保项目质量,我们需要快速高效地找出影响产品质量的因素。如果不能及时高效洞察影响因素,无法及时修复项目缺陷和Bug,往往会对项目造成意想不到的后果和风险,如需求变更、重要开发节点延…

matlab进行mex时出现 error LNK2019: 无法解析的外部符号

解决方法分成三个步骤: 1、直接在simulink模块运行出现错误,找不到该s函数; 2、需要确认安装了编译器。mex -setup 确认安装了编译器,再次mex xxx.c未解决; 3、再次查找资料发现可能编译器不知道具体的位置&#xff0c…

【快应用】list组件如何区分滑动的方向?

【关键词】 list组件、滑动方向、scroll 【问题背景】 有cp反馈list这个组件在使用的时候,不知道如何区分它是上滑还是下滑。 【问题分析】 list组件除了通用事件之外,还提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…

io_uring笔记

目录 io_uring 异步io_uring 使用对比于epoll的效果io_uring效果好在哪? io_uring 异步 要求内核linux 5.10 异步四元组:1、init(create)2、commit 3、callback 4、destory fio : 测iops一秒钟读写磁盘的次数 方式磁盘iopsio_ur…