JVM系统优化实践(7):垃圾回收器与垃圾回收算法

news2025/1/18 9:09:03

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~


上回说到了年轻代、老年代与数据计算的一个案例。接下来就先讲一讲年轻代和老年代的两个垃圾回收器:ParNew和CMS。

和Serial垃圾回收器一样,ParNew也是对年轻代进行垃圾回收,但Serial垃圾回收器是单线程的,而ParNew是多线程的。

如果要指定使用ParNew垃圾回收器,只需在JVM中开启-XX:+UseParNewGC参数就行了。

ParNew的默认线程数量和CPU核数一致,如果要调节ParNew线程数量,使用-XX:ParallelGCThreads参数即可,一般不用更改。启动系统时可以分别指定客户端模式与服务器模式,只要在参数后分别跟上-client和-server就行了。客户端模式与服务器模式的区别是:

1、如果部署在类Unix机器上,就用服务器模式;如果部署在Windows上,就是客户端模式;

2、服务器模式通常是多核的大型系统后端;客户端模式通常是给applet这类的客户端程序使用,机器也多为单核。

而老年代的垃圾回收器CMS使用的是标记清理算法:标记出哪些是垃圾对象,然后就把它们清理掉。但这可能会造成内存碎片过多,导致空间严重浪费。因此,CMS采取GC线程 + 工作线程同时执行的方式。

CMS的一次典型垃圾回收过程如下:

1、初始标记阶段。初始标记意味着系统要进入Stop the World状态,仅仅标记出所有被GC Roots直接引用的对象(方法的局部变量和静态变量),并不会执行清理。

2、并发标记阶段。系统程序恢复运行,GC线程则会尽可能对全部老年代里已有对象进行GC Roots追踪(即弄清全部老年代里的对象是否被引用了)。

3、重新标记阶段。系统程序再次被禁止运行,对在上一阶段程序运行时状态发生变更的对象进行标记。

4、最后是并发清理阶段。系统程序再次恢复运行,清理掉之前标记为垃圾的对象即可。

因此这就可以解释为什么老年代会比年轻代速度慢很多了。主要就是CMS会导致资源紧张。系统线程和GC线程同时工作,会导致有限的CPU资源被占用,尤其是进行GC Roots时。

CMS默认启动的GC线程数量 = (CPU核数 + 3) / 4。

在第四阶段(即并发清理阶段),会产生浮动垃圾,即GC本身产生的新垃圾。

浮动垃圾要等到下一次Minor GC时才会被回收。所以JVM会预留一些空间,保证在CMS期间让存活对象能进入老年代。前面也说过CMS的触发时机就是当老年代内存占用达到一定比例时启动。-XX:CMSInitiatingOccupancyFraction参数就是用来设置这个阈值,超过设定值则开启CMS(JDK1.8已不建议使用)。JDK8的默认比例值是92%,具体原因可以参考这个官方链接:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html

另外,CMS执行时会遇到一个Concurrent Mode Failure问题:也就是当要进入到老年代的存活对象大于可用内存空间时,意味着CMS执行失败。此时会自动用Serial Old代替CMS——强行Stop the World,垃圾回收完成后再恢复系统线程。

执行GC时产生的内存碎片由这两个JVM参数决定:

1、-XX:UseCMSCompactAtFullCollection参数会默认打开,避免CMS产生的内存碎片问题,意思是Full GC之后再次进行Stop the World,清理碎片(JDK1.8已不建议使用);

2、-XX:CMSFullGCsBeforeCompaction参数表示执行多少次Full GC之后再进行碎片清理(默认0,表示每次都清理,JDK1.8已不建议使用)。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

实战:yaml方式安装ingress-nginx-2023.3.2(测试成功)

实战:yaml方式安装ingress-nginx-2023.3.2(测试成功) 目录 文章目录实战:yaml方式安装ingress-nginx-2023.3.2(测试成功)目录实验环境实验软件1、安装过程2、第一个示例关于我最后最后实验环境 实验环境: 1、win10,vmwrokstation虚机&#x…

AI_News周刊:第四期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 News 1.对抗“唤醒人工智能”马斯克招募团队开发 OpenAI 竞争对手 据两位直接了解这项工作的人士和另一位了解情况的人士透露,埃隆马斯克最近几周与人工智能研究人员接洽,商讨成…

详细分析什么是进程?如何理解进程状态?

什么是进程? 比较官方一点的回答是:当一个程序加载到内存的时候,就是一个进程。 但是这是不准确的回答,进程是怎么在内存中形成的,以及内存是如何管理进程的,是通过什么描述进程的?下面我们将…

Neo4j数据库部署配置

这里写目录标题一、neo4j图形数据库安装与部署1.1配置JDK运行环境(注意jdk与neo4j版本对应)1.2部署Neo4j(注意jdk与neo4j版本对应)二、数据库基本操作演示一、neo4j图形数据库安装与部署 1.1配置JDK运行环境(注意jdk与…

centos安装rocketmq

centos安装rocketmq1 下载rocketmq二进制包2 解压二进制包3 修改broker.conf4 修改runbroker.sh和runserver.sh的JVM参数5 启动NameServer和Broker6 安装rockermq dashboard(可视化控制台)1 下载rocketmq二进制包 点击rocketmq二进制包下载地址,下载完成之后通过ft…

javaEE 初阶 — 数据链路层中的以太网数据帧

文章目录以太网帧格式1. MAC 地址2. MAC 地址是如何与 IP 地址相互配合的3. 以太网帧格式中的类型MTU(了解)以太网帧格式 数据链路层主要考虑的是相邻的两个结点之间的传输。 这里最知名的协议就是 以太网。 一个以太网数据帧有三个部分组成。帧头载荷…

【GlobalMapper精品教程】055:GM坐标转换器的巧妙使用

GM软件提供了一个简单实用的坐标转换工具,可以实现地理坐标和投影坐标之间的高斯正反算及多种转换计算。 文章目录 一、坐标转换器认识二、坐标转换案例1. 地理坐标←→地理坐标2. 地理坐标←→投影坐标三、在输出坐标上创建新的点四、其他转换工具的使用一、坐标转换器认识 …

653600-56-7,Ac4GaINAz,N-叠氮四酰化半乳糖用于PROTAC合成

基础产品数据:CAS号:653600-56-7中文名:N-叠氮四酰化半乳糖,叠氮修饰半乳糖英文名: Ac4GaINAzAc4GaINAz结构式(Structural):详细产品数据:分子式:C16H22N4O10…

python学习——【第二弹】

前言 上一篇文章 python学习——【第一弹】给大家介绍了python中的基本数据类型等,这篇文章接着学习python中的运算符的相关内容。 运算符 python中的运算符主要有:算术运算符,赋值运算符,比较运算符,布尔运算符以及…

NPP夜间灯光遥感数据读取与可视化

1、Google Earth EngineGoogle Earth Engine是Google推出的行星尺度的遥感云计算平台,提供了大量遥感数据的集成与运算工具。同时也包括DMSP和NPP夜间灯光遥感数据(月尺度和年尺度)。这里给出样例的可视化代码。var dataset ee.ImageCollect…

1.2 CSS标签选择器,类选择器

CSS选择器: 根据不同的需求选出不同的标签,进行美化装饰 1. 标签选择器 标签选择器(元素选择器):用 HTML标签名作为选择器,按标签名称进行分类,为页面某一类标签指定统一的CSS样式 作用: 可以把某一类标签全部选中&…

UWB通道选择、信号阻挡和反射对UWB定位范围和定位精度的影响

(一)介绍检查NLOS操作时需要考虑三个方面:(1)由于整体信号衰减,通信范围减小。(2)由于直接路径信号的衰减,导致直接路径检测范围的减小。(3)由于阻…

记录--手摸手带你撸一个拖拽效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近看见一个拖拽效果的视频(抖音:艾恩小灰灰),看好多人评论说跟着敲也没效果,还有就是作者也不回复大家提出的一些疑问,本着知其然必要知其所以然…

栈帧之局部变量表(Local Variables)解读

局部变量表也被称之为局部变量数组或本地变量表 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表…

2023最新版本RabbitMQ下载安装教程

一、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。主要用于在进程、应用程序和服务器之间交换数据,可以通过插件支持进行扩展,支持许多协议,并提供高性能、可靠性、集群和高可用队列。 AMQP :Advanced Me…

2023年疫情开放,国内程序员薪资涨了还是跌了?大数据告诉你答案

自从疫情开放,国内各个行业都开始有复苏的迹象,尤其是旅游行业更是空前暴涨,那么互联网行业如何? 有人说今年好找工作多了,有人说依然是内卷得一塌糊涂,那么今年开春以来,各个岗位的程序员工资…

第十四届蓝桥杯模拟赛(第三期)试题与题解 C++

目录 一、填空题 (一)最小的十六进制(答案:2730) (二)Excel的列(答案:BYT) (三)相等日期(答案:70910) (四)多少种取法(答案:189)…

20 客户端服务订阅的事件机制剖析

Nacos客户端服务订阅的事件机制剖析 我们已经分析了Nacos客户端订阅的核心流程:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理,然后更…

超长文解析Linux块设备驱动编写方法

1.前提知识 一个块驱动提供对块存储设备(比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等)以固定大小(块的大小由内核决定,常常是 4096 字节 )的块为基本单位,进行随机的存取。…

【项目实战】使用Feign服务间相互调用,其实OpenFeign也没有想象中那么难嘛

一、Feign介绍 openfeign是一个java的http客户端,用来简化http调用 二、Feign架构(来自官方) Feign由五大部分组成, 由于刚开始接触 feign ,比较关注的 clients 跟 encoders/decoders 三、OKHTTP与Feign之间的关系 在Feign中,Client是一个非常重要的组件,Feign最终…