JVM基础(10)——老年代调优

news2024/9/21 4:33:47

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、简介

上一章中,我们通过一个实际案例讲解了如何进行新生代的JVM参数调优,本章我们来继续分析这个问题,在上一章优化好的背景下,讲解如何进行老年代的调优。

我们先来回顾下,每隔20s,新生代经历Minor GC后,会产生100MB存活对象:

JVM的参数配置如下:

-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

二、老年代调优

2.1 何时进入老年代

晋升年龄

首先,由于我们设置的晋升年龄为5,所以躲过5次Minor GC的存活对象会进入老年代,这些对象一般是系统的业务逻辑组件,不会很大,基本也就几十MB,它们会长期存活在老年代中:

大对象

按照我们的JVM参数,超过1MB的大对象会直接进入老年代。但是我们的系统中假设是不存在这种大对象的,所以可以忽略这块内容。

Survivor空间不足

Minor GC过后,存活对象大小可能超过Suvivor空间大小(200MB),虽然我们之前已经对此进行了优化,调整过S区的大小,但是在一些突发场景下,比如大促期间,仍然可能出现超过200MB的存活对象。

我们现在就假设每隔5min,就会有一批超过200MB的存活对象进入老年代:

那么多久会触发Full GC呢?之前分析过,触发Full GC一共有以下几种情况(排除JDK1.6及以前的情况):

  1. 老年代可用内存 < 历代晋升老年代的平均对象大小;
  2. 老年代可用内存 < 本次晋升老年代的存活对象大小;
  3. 设置了-XX:CMSInitiatingOccupancyFaction参数,当老年代内存占用达到该比例时,也会触发Full GC;

其实在生产环境下,只要对新生代进行过上一章节的优化,那对象进入老年代的速度是非常慢的。很可能在系统运行了大约半小时~1小时之后,才会有接近1G的对象进入老年代,而且上述Full GC的情况一般需要在老年代近乎快占满的情况下才可能触发。

Concurrent Mode Failure

经过前面的推算,我们基本可以知道,系统运行1小时后,老年代的存活对象大概有900MB,此时就会触发一次Full GC:

但是由于老年代只剩下约100MB的可用空间,所以在CMS进行并发清理的时候,如果有新的对象(假设大约200MB)进入老年代,就会出现“Concurrent Mode Failure”:

当出现“Concurrent Mode Failure”时,JVM会立即进入“Stop the World”,然后切换成Serial Old垃圾回收器,采用单线程方式进行老年代的垃圾回收,回收掉900MB对象后,再恢复系统运行:

Concurrent Mode Failure出现的概率其实是非常小的,首先必须是在CMS触发Full GC期间,其次还需要在此期间有对象晋升到老年代,且这些对象的大小要大于老年代可用空间。

经过上述调优后,JVM的参数配置如下:

-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFaction=92

2.2 内存碎片整理

在CMS完成Full GC后,会对老年代进行内存碎片整理。我们可以通过配置来设置经过多少次Full GC后进行一次内存碎片整理。

但是,通过上述分析,我们知道,Full GC的频率本身并不高,在高峰时期也就一个多小时一次,高峰过去后,很可能几小时才会触发一次Full GC。所以,对于内存碎片整理,保持默认值就可以,即每次Full GC完成后进行一次整理。

经过上述调优后,JVM的参数配置如下:

-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFaction=92 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0

三、总结

本章,我们讲解了针对老年代的调优,其实可以看到,老年代调优的根本目的就是降低Full GC频次,而前提就是对Minor GC进行优化,以减少对象进入老年代。

对于很多Java系统而言,只要对系统运行期间的内存模型做好预估,然后合理分配JVM的各内存区域,尽量让Minor GC后的存活对象留在Survivor不要去老年代,那么即使其余的JVM参数不做优化,系统性能基本上也能满足要求。

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

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

相关文章

MySQL数据库入门到大牛_高级_00_MySQL高级特性篇的内容简介

文章目录 一、整个MySQL的思维导图二、MySQL高级特性篇大纲1. MySQL架构篇2. 索引及调优篇3. 事务篇4. 日志与备份篇 一、整个MySQL的思维导图 下图为整个MySQL内容&#xff0c;01-05是基础篇&#xff0c;06-09是高级篇 二、MySQL高级特性篇大纲 MySQL高级特性分为4个篇章&…

2.4G水墨屏电子标签|RFID电子纸基站CK-RTLS0501G_VT硬件功能与联机方法

2.4G水墨屏|RFID电子纸基站CK-RTLS0501G_VT是基于2.4G无线技术的可视化标签基站&#xff0c;支持10个通道范围根据使用环境情况来设定使用通道能有效避免干扰的情况。该基站支持对可视化标签进行固件及显示模板的更新等功能&#xff0c;更好集中管理可视化标签。可广泛应用于制…

AI文本生图模型Stable Diffusion部署教程

本文基于CentOS8进行Stable Diffusion开源框架部署. 1. DNS配置(但是今天出现了偶尔无法下载问题) 为了加速Github访问,我在本机配置如下 (sd) [rootshenjian stable-diffusion-webui]# cat /etc/hosts 127.0.0.1 shenjian localhost localhost.localdomain localhost4 loca…

VMware虚拟机安装银河麒麟桌面版V10系统

1镜像下载 1.1打开官网 百度搜索或浏览器地址栏直接输入地址 1.2找到镜像下载 选择桌面版操作系统进行安装我们日常办公使用的是桌面版的系统,选择桌面版操作系统进行下载 1.3申请试用 现在安装系统需要填写申请试用表,填写完之后,才会调转到镜像下载随着国产系统的日益…

QT基础篇(1)QT概述

1.什么是QT QT是一个跨平台的C应用程序开发框架。它提供了一套丰富的图形用户界面&#xff08;GUI&#xff09;和多媒体功能&#xff0c;可以用于开发各种类型的应用程序&#xff0c;包括桌面应用程序、移动应用程序和嵌入式系统。QT具有易于使用、可定制性强、性能高等特点&a…

C语言变量与函数

目录 变量函数 变量 变量&#xff1a;计算机里的一块内存空间int a 0; 表示定义一个整型 int 变量&#xff1b;这个变量名字叫做 a “” 表示赋值&#xff1b;即将右边的 0 赋值给左边的整型变量 a 现在这一块空间 a 存放了一个值 0 这个过程也叫做整型变量 a 的初始化初始化…

Web后端开发

一、Maven 1.1 简介 1.2 作用 1.3 流程 通过各种插件实现项目的标准化构建。 1.4 安装 1.5 配置环境 1.5.1 当前工程环境 1.5.2 全局环境 1.6 创建 Maven项目 1.7 导入项目 1.8 依赖管理 1.8.1 依赖配置 1.8.2 依赖传递 pom.xml——右键——Diagrams——show dependen…

【物联网】物联网设备和应用程序涉及协议的概述

物联网设备和应用程序涉及协议的概述。帮助澄清IoT层技术栈和头对头比较。 物联网涵盖了广泛的行业和用例&#xff0c;从单一受限制的设备扩展到大量跨平台部署嵌入式技术和实时连接的云系统。 将它们捆绑在一起是许多传统和新兴的通信协议&#xff0c;允许设备和服务器以新的&…

飞鱼CRM接入第三方系统 飞鱼API对接详细教程

场景描述 在白码低代码开发平台中&#xff0c;是支持外部crm系统的线索通过接口流入到白码系统里面&#xff0c;换而言之&#xff0c;只要外部的系统有线索api接口&#xff0c;白码系统可以接收线索并在白码系统上进行后续操作。本文以飞鱼crm系统为例&#xff0c;讲解如何接收…

Linux高性能服务器编程——学习笔记①

第一章、tcp/ip协议族 一、tcp/ip协议族1.1 主要的协议1.1.1 数据链路层1.1.2 网络层1.1.3 传输层1.1.4 应用层 1.2 封装1.3 分用1.4 测试网络1.5 ARP协议工作原理1.5.1 以太网ARP请求/应答报文详解1.5.2 ARP高速缓存的查看和修改1.5.3 使用tcpdump观察ARP通信过程 1.6 DNS工作…

CAN总线通信详解 (超详细配34张高清图)

CAN总线通信详解 (超详细配34张高清图) 1. CAN总线历史 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO国际标准化的串行通信协议。 在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#…

慕尼黑工业大学最新提出!单目实时密集建图的混合隐式场方法

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 我们提出了一种新颖的方法&#xff0c;它将基于深度学习的密集SLAM与神经隐式场相结合&#xff0c;实时生成密集地图&#xff0c;而无需像以前的方法那样依赖RGB-…

如何确定测试用例的优先级?5个方面

测试用例优先级的确定&#xff0c;有助于测试团队合理分配测试资源&#xff0c;集中精力测试重点功能和场景&#xff0c;确保重点功能测试用例的覆盖率&#xff0c;从而有利于快速发现和解决重点功能缺陷&#xff0c;确保项目进度和质量。 如果测试用例没有明确的优先级&#x…

大数据调度框架Oozie,这个学习网站让你事半功倍!

Oozie是一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache。它主要用于管理和调度Apache Hadoop作业&#xff0c;支持的任务类型包括Hadoop MapReduce、Pig Jobs等。 Oozie的核心概念包括workflow jobs和coordinator jobs。Workflow jobs是由多个动作&#…

Raspbian安装摄像头

Raspbian安装摄像头 1. 源由2. 摄像头2.1 选型2.2 系统2.3 安装 3. 配置&命令3.1 命令3.2 配置 4. 测试4.1 拍照4.1.1 libcamera-jpeg4.1.2 libcamera-still 4.2 视频流4.2.1 RTSP流4.2.2 TCP流 5. 参考资料 1. 源由 家里闲置两块树莓派&#xff0c;打算做个WiFi视频流RTS…

四川云汇优想教育咨询有限公司引领电商未来

四川云汇优想教育咨询有限公司&#xff0c;一家在电商服务领域崭露头角的领军企业&#xff0c;致力于为广大客户提供最优质、最全面的电商服务。作为业界翘楚&#xff0c;云汇优想凭借其卓越的服务品质和强大的技术实力&#xff0c;在激烈的市场竞争中独树一帜&#xff0c;赢得…

Python入门-面向对象

1.类和对象 是不是很熟悉&#xff1f;和Java一样&#xff0c;在Python中&#xff0c;都可以把万物看成(封装成)对象。它俩都是面向对象编程 1.1 查看对象数据类型 a 10 b 9.8 c helloprint(type(a)) print(type(b)) print(type(c))运行结果&#xff1a; D:\Python_Home\v…

九州金榜|孩子不自信,根源在父母,莫让孩子失去自我

家长在看待孩子时&#xff0c;往往会忽视孩子内在的真实感受&#xff0c;以自己的想法去要求孩子。 聚会聚餐&#xff0c;就让孩子去表演节目&#xff1b; 出门游玩&#xff0c;看到舞台就让孩子去参加&#xff1b; 在家休息&#xff0c;让孩子独自一人睡觉... 这些行为孩子…

红日靶场1

文章目录 红日靶场的渗透思路一、靶场搭建网络拓扑1.win7配置2&#xff0c;win2003配置3&#xff0c;server2008配置4&#xff0c;kali配置 二、渗透流程一.信息收集二&#xff0c;获取webshell1.进入后台之后&#xff0c;可以选择插入一句话木马------失败2.在日志中插入木马3…

odoo14 动态改变进度条颜色(widget=“progressbar“)底色,边框,进度颜色

在odoo14中当时使用&#xff1a;widget"progressbar" 时默认表现为&#xff1a; 但我想在不同的比例展示不同的颜色&#xff0c;和其他的样式颜色&#xff1a; tree视图 form视图 也一样&#xff1a; 说明&#xff1a;进度0-30为蓝色&#xff0c;31-80为黄色&…