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.mzph.cn/news/31590.shtml

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

相关文章

Spring整合MyBatis(详细步骤)

Spring与Mybatis的整合&#xff0c;大体需要做两件事&#xff0c; 第一件事是:Spring要管理MyBatis中的SqlSessionFactory 第二件事是:Spring要管理Mapper接口的扫描 具体的步骤为: 步骤1:项目中导入整合需要的jar包 <dependency><!--Spring操作数据库需要该jar包…

2023年初中信息技术学科暑假备课

目录 2023年初中信息技术学科暑假备课1. 创意空间1.1 教师的空间1.2 学生的空间1.3 关于FTP服务器设置 2. 什么是编程2.1 编程语言2.2 人人都应学好编程2.3. 编程难吗&#xff1f;2.4 python用途 3. 开发环境3.1 打开IDLE3.2 IDLE窗口3.2.1 shell窗口和编辑窗口 4. 项目式教学4…

使用雅可比行列式方法求Henon映射的lyapunov exponent

雅可比行列式方法 计算Henon映射的Lyapunov exponent图谱,算法描述为: 0:初始化:初始化用到的值。参数a:[0,1.4],b:0.3,初始值x和y:1,迭代次数M:2000。 1:遍历参数a:计算不同a值所对应的Henon映射的Lyapunov exponent图谱。 2:迭代M次: 计算得到Henon映射的…

【VSCode】查看二进制文件

1.安装插件Hex Editor 2.打开二进制文件 3.执行Hex Editor命令

通用FIR滤波器的verilog实现(内有Lowpass、Hilbert参数生成示例)

众所周知&#xff0c;Matlab 中的 Filter Designer 可以直接生成 FIR 滤波器的 verilog 代码&#xff0c;可以方便地生成指定阶数、指定滤波器参数的高通、低通、带通滤波器&#xff0c;生成的 verilog 代码也可以指定输入输出信号的类型和位宽。然而其生成的代码实在算不上美观…

统计列表加小计

提供个思路&#xff0c;欢迎其他大佬指正 注意使用 排序&#xff08;seq&#xff09;&#xff0c;group by&#xff0c;union all SELECTf.* FROM(SELECTcus_id,max( cusname ) cusname,NULL dodate,sum( money ) sumMoney,NULL payed,NULL unpayed,1 seq FROMtb_outbase GRO…

python numpy数组水平和垂直合并

1 水平Horizontal合并 Horizontal:水平向右拉长 利用np.hstack()&#xff1a;原始数据size可以不一致 利用np.concatenate()&#xff1a;原始数据size可以不一致 import numpy as np # 三个一维数组 array1 np.array([1, 2, 3]) array2 np.array([4, 5, 6]) array3 np.ar…

【数据结构OJ题】移除元素

原题链接&#xff1a;https://leetcode.cn/problems/remove-element/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 方法一&#xff1a;暴力删除&#xff0c;挪动数据覆盖。即遍历整个nums[ ]数组&#xff0c;遇到值等于val的元素&#xff0c;就将整…

JVM工作的总体机制概述

JDK、JRE、JVM关系回顾 JVM&#xff1a;Java Virtual Machine&#xff0c;翻译过来是Java虚拟机JRE&#xff1a;Java Runtime Environment&#xff0c;翻译过来是Java运行时环境 JREJVMJava程序运行时所需要的类库JDK&#xff1a;Java Development Kits&#xff0c;翻译过来是…

电脑怎么查看连接过的WIFI密码(测试环境win11,win10也能用)

电脑怎么查看连接过的WIFI密码 方法一&#xff1a;适用于正在连接的WIFI密码的查看 打开设置 点击“网络和Internet”&#xff0c;在下面找到“高级网络设置”点进去 在下面找到 “更多网络适配器选项” 点进去 找到 WLAN &#xff0c;然后双击它 5.然后点击“无线属性” 6.…

WPS的excel表格单元格拖动数字日期等 不自增原因

对着表格中的每个单元格右下角,在变成下图,黑十字后,拖动这个十字.就会在右侧出现一个小窗口. 里面菜单中可以选择按序数增加 但是,如果拖动,发现小窗口菜单不出现.说明这一栏开启了筛选功能.清空筛选条件后,即可恢复自增功能.

Element-ui中分页器的使用

<template>中写&#xff1a; js中写&#xff1a;

大模型的数据隐私问题有解了,浙江大学提出联邦大语言模型

作者 | 小戏、Python 理想化的 Learning 的理论方法作用于现实世界总会面临着诸多挑战&#xff0c;从模型部署到模型压缩&#xff0c;从数据的可获取性到数据的隐私问题。而面对着公共领域数据的稀缺性以及私有领域的数据隐私问题&#xff0c;联邦学习&#xff08;Federated Le…

jvm-程序计数器

1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器&#xff0c;cpu中读取速度…

关于安卓jar包修改并且重新发布

背景&#xff1a; 对于某些jar包&#xff0c;其内部是存在bug的&#xff0c;解决的方法无外乎就有以下几种方法&#xff1a; &#xff08;1&#xff09;通过反射&#xff0c;修改其赋值逻辑 &#xff08;2&#xff09;通过继承&#xff0c;重写其方法 &#xff08;3&#xff0…

卡巴斯基为基于Linux的嵌入式设备推出专用解决方案

导读卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持。这种适应性强的多层解决方案现在为基于Linux的嵌入式系统、设备和场景提供优化的安全&#xff0c;合通常适用于这些系统的严格监管标准。 卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持…

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个名字…

Oracle 开发篇+Java通过HiKariCP访问Oracle数据库

标签&#xff1a;HikariCP、数据库连接池、JDBC连接池、释义&#xff1a;HikariCP 是一个高性能的 JDBC 连接池组件&#xff0c;号称性能最好的后起之秀&#xff0c;是一个基于BoneCP做了不少的改进和优化的高性能JDBC连接池。 ★ Java代码 import java.sql.Connection; impor…

品牌渠道控价常见问题有哪些

不管是哪个品牌在做控价时&#xff0c;会遇到的问题都是相通的&#xff0c;如果筛选低价、窜货链接&#xff0c;如何去治理这些链接&#xff0c;使其下架&#xff0c;或者是改价。也会有品牌需要针对渠道中的乱价问题进行提前预警或者规避&#xff0c;这些可以通过分析电商数据…

Chatgpt API调用报错:openai.error.RateLimitError

Chatgpt API 调用报错&#xff1a; openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details. 调用OpenAI API接口 import openai import osopenai.api_key os.getenv("OPENAI_API_KEY")result openai.Chat…