JVM配置CMS调优实战笔记

JVM性能调优实战:从理论到线上问题排查 GC技术进步ZGC和Shenandoah的持续优化,进一步降低GC暂停时间可能出现新的特定场景GC算法,如针对超大堆或特定应用模式机器学习辅助的自适应GC策略JIT编译优化更智能的即时编译策略更好的向量化和SIMD支持针对新CPU架构的优化容器环境适应更完善的容器资源感知更好的资源弹性调整能力针对Kubernetes等平台的优化监控与诊断工具更低开销的实时监控更智能的问题诊断和根因分析与APM工具的深度集成专业洞见。 阅读详情

一、背景说明

       由于原有项目未进行JVM配置,全部是用默认JVM配置,在压测过程中TP99惨不忍睹,Young gc使用PS Scavenge,Full gc使用PS MarkSweep

二、JVM基础知识

       1) 虚拟机内存模型:
           程序计数器、虚拟机栈、本地方法栈、JVM堆、方法区(粗略理解包含永久代)

        2) 垃圾收集算法:
            标记-清除、复制、标记-压缩、分代收集算法

        3) jvm堆区分代:
             Eden(年轻代-伊甸园区)、Survivor0(年轻代-存活1区)、Survivor1(年轻代-存活2区)、Old Generation(老年代区)

        4) 垃圾收集器分类:
            Serial : 年轻代、串行、复制算法,默认年轻代收集器, -XX:+UseSerialGC 手动指定年轻代使用Serial收集器 
            Serial Old :老年代、串行、标记-清除、默认老年代收集器、 -XX:+UseSerialGC 手动指定老年代使用Serial收集器
            ParNew :年轻代,并行、复制算法、常用于多核CPU机器上,-XX:+UseParNewGC 手动指定年轻代使用ParNew收集器,可配合CMS收集器使用
            Parallel:年轻代、并行、复制算法、吞吐量优先,-XX:+UseParallelGC手动设置年轻代使用Parallel收集器,-XX:+GCTimeRatio 0~100 手动设置吞吐量大小,-XX:+MaxGCPauseMills 收到设置最大垃圾收集停顿时间
            Parallel Old:老年代、并行、复制算法、吞吐量优先,-XX:+UseParallelOldGC 手动设置年轻代、老年代都使用Parallel收集器
            CMS:老年代、并行、 标记-清除、高响应低延迟,-XX:+UseConcMarkSweepGC 手动设置老年代使用CMS收集器
            G1:使用Region区间贯穿年轻代和老年代,可以将年轻代、老年代理解为标签,而GC回收就相当于是在为每个Region区间进行贴标签的过程。根据回收情况将Region区间定为年轻代和老年代(未在实战中使用过,不做过多介绍)。
            G1相关说明可参见:https://blog.youkuaiyun.com/TimerBin/article/details/97148182

         5)Young GC/Full GC
             Young GC:Minor GC 对年轻代空间进行回收,-Xmn1024M 手动指定年轻代内存上限值
              Full GC:Major GC 对老年代空间进行回收,在进行Major GC之前会优先触发Minor GC

三、JVM常用配置参数

        1) -Xmn: 新生代内存上限值
        2) -Xms: 整个堆区初始内存分配的大小
        3) -Xmx: 整个堆区内存分配的最大上限,推荐-Xms和-Xmx设置等同大小,避免动态回收消耗资源
        4) -XX:+HeapDumpOnOutOfMemoryError 当出现OOM时,打印堆转储dump文件
        5) -XX:HeapDumpPath= 指定堆转储dump文件存储路径
        6) -XX:MaxTenuringThreshold=5 : 手动设置对象在新生代中存活年龄(存活次数),默认15次
        7) -XX:SurvivorRatio=6 : Eden区与Survivor0、Survivor1区的大小比值,一般设置为6,Eden:S0:S1=6:1:1
        8) -XX:PretenureSizeThreshold 手动指定对象大小,当对象达到指定大小时直接存放到老年代中,由于新生代大多使用复制算法,为了节省复制消耗
         9) -XX:+UseParNewGC : 手动指定新生代使用 ParNew 收集器
         10) -XX:+UseConcMarkSweepGC : 手动指定老年代使用CMS收集器
         11) -XX:PermSize=512M 指定非堆区域(永久代)初始内存分配大小, JDK 1.7 及以下生效
         12) -XX:MaxPermSize= 1024M 指定非堆区域(永久代)内存分配的最大上限,JDK1.7 及以下生效
         13) -XX:+UseCMSInitiatingOccupancyOnly : Hotspot会根据成本计算决定是否需要执行CMS收集器,可手动设置-XX:+UseCMSInitiatingOccupancyOnly关闭计算策略,强制使用CMS 收集器
         14)  -XX:+CMSClassUnloadingEnabled : 手动指定CMS 收集器对非堆区域永久代进行回收,默认永久代不回收
         15) -XX:CMSInitiatingOccupancyFraction=80 : 手动指定当老年代已用空间达到80%时,触发老年代回收(默认92%)
         16) -XX:CMSInitiatingPermOccupancyFraction=80  : 手动指定当永久代已用空间达到80%时,触发永久代回收(默认92%)
         17) -XX:+DisableExplicitGC : 手动配置禁止使用外部调用System.gc 来进行触发垃圾回收
         18) -XX:+UseCMSCompactAtFullCollection : 在进行Full GC时对内存进行压缩,JDK1.6以前不需要配置,默认开启
         19) -XX:CMSFullGCsBeforeCompaction=2 : 与-XX:+UseCMSCompactAtFullCollection 关联使用标识着每经过多少次Full GC 触发对内存进行一次压缩,默认是0次
          20) -XX:-CMSParallelRemarkEnabled : 手动配置开启并行标记,节省年轻代标记时间,JDK1.6以前不需要配置,默认开启
          21) -Xnoclassgc  : 关闭CLASS的垃圾回收功能,默认20分钟这个class未被使用,虚拟机会卸载这个类。再次使用时重新加载

四、JVM配置小记

linux机器配置:4核8G

问题一

原有JVM配置参数:

-XX:PermSize=512M -XX:MaxPermSize=1024M -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC 

遇到的问题:

  • full gc 执行次数较多,影响用户体验
  • 在full gc执行过程中,导致sql执行超时,被数据库慢SQL命中

可能的原因:

  • 使用默认年轻代和老年代回收器,串行GC,stop-the-world时间较长
  • 使用了默认的存活次数15,增加了在Eden和Survivor区进行复制回收成本
  • 年轻代大小或者年轻代中Eden区与Survivor0、Survivor1空间分配不合理。如果Eden区太小会导致大于Eden区一半对象直接储存到老年代,增加老年代的使用情况

优化后配置:

-Xmx6144M -Xms6144M -XX:PermSize=512M -XX:MaxPermSize=1024M -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=5 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

问题二

使用问题一优化后JVM配置:

遇到的问题:

  • yong gc 次数增多,full gc次数近乎为零
  • 由于full gc次数减少,随时间推移,堆内存使用量会持续增长,触发堆内存使用情况报警,目前配置的堆内存使用90%就会报警。

可能的原因:

  • full gc执行次数减少,导致老年代未进行回收
  • 未开启永久点缓存回收

优化后配置:

 -Xmx6144M -Xms6144M -XX:PermSize=512M -XX:MaxPermSize=1024M -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=5 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly  -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=85   -XX:CMSInitiatingPermOccupancyFraction=85

五、总结

    没有最优的JVM配置,只有最适合的JVM配置,需要结合系统的类型(worker任务、MQ消费、对外接口、WEB平台)和对JVM回收情况的监控,逐步对JVM配置进行调优,持久观察优化,方能配置适合自己系统的最佳JVM配置

 

ESP32开发环境与微信小程序通信的完整示例 通过搭建稳定的esp32开发环境,实现其与微信小程序间的双向通信,涵盖Wi-Fi连接、数据收发与协议设计,为物联网应用提供低成本解决方案。 阅读详情

相关推荐

ZYNQ裸机LWIP双网口实现

文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L..

weixin_35865280的博客 1万+

CMS参数调优

1:-XX:+UseConcMarkSweepGC CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器, 如果老年代使用CMS垃圾回收器,需要添加虚拟机参数-"XX:+UseConcMarkSweepGC"。 2:– XX:CMSInitiatingOccupancyFraction =n CMS的另一个缺点是它需要更大的堆空间。因为C...

luzhensmart的专栏 6951

CODESYS做Modbus TCP主站踩坑记:从IP配置到数据映射的完整避坑指南

本文详细记录了在CODESYS中配置Modbus TCP主站的全过程,从IP配置到数据映射的常见问题及解决方案。重点解析了网络适配器选择、Slave ID误解、地址偏移陷阱等关键问题,并提供了实用的调试技巧和性能优化建议,帮助工业通信开发者高效避坑。

weixin_30642561的博客 624

【JVM】CMS简述

记录CMS的执行流程,卡表和三色标记的使用

qq_45888932的博客 2177

Unity与IOS交互,调用IOS系统相机和相册

与IOS的交互,在步骤上要比android简单许多,不会产生因为系统版本,或者包名导致的许多问题。过程中最头疼的一个问题是IOS回调Unity,很简单的一个问题,搞了半天。

Hello Mingo 1万+

java写一个多人线上聊天室

课程作业谔谔

weixin_51614848的博客 1135

老大难的GC原理及调优,这下全说清楚了

概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉及调优目标,GC事件分类、JVM内存分配策略、GC日志分析等 CMS原理及调优 G1原理及调优 GC问题排查和解决思路 GC基础原理 1 GC调优目标 大多...

weixin_30718391的博客 668

云计算虚拟化实验(一)——虚拟机软件VMware的安装以及虚拟机系统的安装(Windows7+CentOS7)

主要内容: 1、虚拟机软件的安装(以VMware为例) 2、虚拟机系统的安装(Window7 + CentOS7) 3、虚拟主机网络互访 4、不同局域网内的虚拟主机互访(软路由——海蜘蛛) 0 ——首先介绍一下什么是虚拟化? 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在

gg_asd的博客 1万+

【JVM技术专题】 性能调优之CMS垃圾回收器「上篇」

如果没有冬天,春天不会如此悦人;如果没有偶尔的不幸,幸运不会如此受人欢迎。

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 1167

【YOLOv8/v9/v10 实战 01】YOLOv8/v9/v10全系列实战对决:性能矩阵、架构拆解与2026部署指南

2026年YOLO生态已进入“战国时代”,Ultralytics YOLOv8/11/26、阿里YOLO12、清华YOLOv10、微软YOLOv9四大路线并行发展。本文基于官方文档、学术论文及实测数据,系统剖析三大核心版本(YOLOv8/v9/v10)的架构演进逻辑,构建覆盖参数量、mAP、FPS、FLOPs的完整性能矩阵。通过8组工业场景实测、全流程代码实现(训练-导出-部署)、6类硬件适配方案,解决新手选型难、进阶者优化无门、工业开发者部署低效的痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 533

Android AMS——AMS初始化(二)

Android AMS 也是一个系统服务,属于系统服务中的引导服务,在 startBootstrapServices() 方法中启动。这里我们就来看一下 ActivityManagerService 的启动流程。

小旭的专栏 774

GC算法之CMS算法

CMS算法 CMS算法是JVM中老年代常用的垃圾回收算法,全称是Concurrent Mark Sweep算法,即并发标记-清除算法。算法的执行步骤如下图所示,共有六个步骤。 CMS-Steps 3.1 初始标记(Initial Mark): CMS算法中两个会触发Stop the World事件中的一个,这个阶段会标记所有与GC Roots直接相关联的对象,以及被存活的青年代对象所直...

一切的困难都来自于自己内心的恐惧 7652

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【JVM调优】如何进行JVM调优?一篇文章就够了!

深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。

种一棵树最好的时间是十年前,其次是现在 4万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM基础和调优

CMS和G1回收器,G1的并发标记周期,为什么要JVM调优? 减少GC,特别是FullGC对象优先在堆的 Eden 区分配大对象直接进入老年代长期存活的对象将直接进入老年代. 当 Eden 区没有足够的空间进行分配时,

分享技术,享受生活 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JVM调优实战:解决CMS concurrent-abortable-preclean LongGC的问题

1. 背景 1.1 多个业务线的应用出现LongGC告警 最近一段时间,经常收到CAT报出来的Long GC告警(配置为大于3秒的为Longgc)。 2. 分析前的一些JVM背景知识回顾 2.1 JVM堆内存划分 新生代(Young Generation) 新生代内被划分为三个区:Eden,from survivor,to survivor。大多数对象在新生代被创建。Minor GC针对的...

思码堂 1万+

JVM调优实践:记录初次JVM调优经历

JVM调优实践:记录初次JVM调优经历前言JVM调优工具参考文章初步调优基本指令选择垃圾收集器初步确定堆大小 前言 之前关于 JVM 调优大部分都只是一些理论依据,具体经验没有,这回正好记录下。 中间一些碰壁与返工的部分就跳过了。 JVM调优工具 jps: 用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jinfo: 可以根据进程号输出并修改运行时的java 进程的opts。 jstat: 一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大

乐之终曲 2284

JAVA8调优指南:如何进行JVM调优、JVM参数

JAVA8调优

升仔聊编程的博客 2084

【JVM实战】JVM参数调优

文章目录JVM参数调优一、调优基本概念二、常用JVM参数三、GC调优思路 JVM参数调优 一、调优基本概念 在调整性能时,JM有三个组件 堆大小调整 垃圾收集器调整 JIT编译器调整 大多数调优选项都与调整堆大小和选择的垃圾收集器有关。 同样,JIT编译器对性能也有很大影响,但是这个对程序员自身要求非常高。 通常,在调优Java应用程序时,重点是以下两个主要目标之一: 响应性:应用程序或系统...

明月沉江春雾晓 8216

JVM调优

因此,建议在调优之前先进行性能分析和监测,针对性地调整参数,并进行实际测试和验证,以确保优化的效果和稳定性。每个参数都有特定的作用和含义,根据具体需求和应用程序的特点,选择适当的参数进行配置和调整。:垃圾回收是JVM的重要功能,但不恰当的垃圾回收策略可能导致长时间的停顿和性能下降。JVM调优旨在选择合适的垃圾回收器、调整垃圾回收参数,平衡吞吐量和停顿时间,减少垃圾回收对应用程序的影响。通过选择合适的垃圾回收器算法和参数,调整垃圾回收策略,可以降低垃圾回收的频率,提高系统的运行效率。

CA优快云的博客 8853

JVM调优-有调优我不用,我就耗着,哎,就是玩儿

JVM调优入门看这一篇就够了,囊括参数总结、IDEA实战、JProfiler安装和Dump分析。 文章目录 JVM调优参数 堆 并行收集器 CMS收集器 辅助信息 IDEA实战 全局配置 应用配置 测试 JProfiler 安装软件 IDEA集成 Dump分析实战

有一分热,发一分光。 5076

JVM调优参数

JVM调优参数配置方式内存参数合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 JVM调优参数 配置方式 java [options] MainClass [arguments] options - JVM启动参数。 配置多个参数的.

360°顺滑 1万+

【JVM系列】JVM调优

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 3万+

JVM调优实战+arthas的调优之路

JVM调优实战+arthas的调优之路

兔哥的技术 999

JVM调优及举例

参数功能-Xms和-Xmx设置初始和最大堆大小新生代与老年代的比例Eden区与Survivor区的比例启用G1垃圾收集器G1的最大GC暂停时间目标输出详细GC日志OOM时生成内存转储文件通过以上案例和参数配置,结合实际业务特点,可以针对性地优化JVM性能。需要注意的是,调优是一个持续的过程,应结合监控数据不断调整。Full GC频繁通常是内存管理的信号灯,分析GC日志和应用行为是定位问题的关键。根据具体场景调整堆内存、GC策略和代码逻辑,能有效降低Full GC的发生频率。

itsniu的博客 2593

【JVM】JVM 实战调优指南赋案例(保姆篇)

即时编译器(JIT)将字节码编译为机器码,以提高运行时性能。热点编译(HotSpot Compilation):编译热点代码,提高执行效率。逃逸分析(Escape Analysis):优化对象的内存分配和回收。

A的博客 3105
上一篇: SpringMVC 重写、扩展HttpServletRequest请求参数
下一篇: nginx 开启gzip压缩
TimerBin
博客等级 码龄12年 54粉丝 119原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值