java超详细的jvm调优

news2024/11/16 9:22:13

JVM调优

看这篇博客之前,可以先看我另外两篇

Java虚拟机(Jvm详解)

Java垃圾回收机制(后续更新)

下面主要从以下几个方面进行展开描述:

  • JVM实践调优主要步骤
  • 分析GC日志
  • 堆内存与元空间优化
  • 线程堆栈优化
  • 堆内存内部优化:新生代和老年代比例
  • 垃圾回收器优化

1. JVM实践调优主要步骤

第一步:监控分析GC日志

第二步:判断JVM问题:

  • 如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化
  • 如果GC时间超过1-3秒,或者频繁GC,则必须优化。

第三步:确定调优目标

第四步:调整参数

  • 调优一般是从满足程序的内存使用需求开始,之后是时间延迟要求,最后才是吞吐量要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。

第五步:对比调优前后差距

第六步:重复: 1 、 2 、 3 、 4 、 5 步骤

  • 找到最佳JVM参数设置

第七步:应用JVM到应用服务器:

  • 找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。

2.分析GC日志

2.1 初始参数设置

机器环境:

指标参数
机器CPU 12核,内存16GB
集群规模单机
seqb_web版本1.0
数据库4核 16G

Jvm调优典型参数设置;

  1. -Xms堆内存的最小值:

    • 默认情况下,当堆中可用内存小于40%时,堆内存会开始增加,一直增加到-Xmx的大小。
  2. -Xmx堆内存的最大值:

    默认值是总内存/64(且小于1G)

    • 默认情况下,当堆中可用内存大于70%时,堆内存会开始减少,一直减小到-Xms的大小;
  3. -Xmn新生代内存的最大值:

    • 1.包括Eden区和两个Survivor区的总和
    • 2.配置写法如:-Xmn1024k,-Xmn1024m,-Xmn1g
  4. -Xss每个线程的栈内存:

    • 默认1M,一般来说是不需要改。线程栈越小意味着可以创建的线程数越多

整个堆的大小 = 年轻代大小 + 年老代大小,堆的大小不包含元空间大小,如果增大了年轻代,年老代相应就会减小,官方默认的配置为年老代大小/年轻代大小=2/1左右;

建议在开发测试环境可以用Xms和Xmx分别设置最小值最大值,但是在线上生产环境,Xms和Xmx设置的值必须一样,防止抖动;

2.2 JVM调优设置合大小堆内存空间

JVM调优设置合大小堆内存空间既不能太大,也不能太小。那么应该设置为多少呢

默认的配置是否存在性能瓶颈。如果想要确定JVM性能问题瓶颈,需要进一步分析GC日志

  1. -XX:+PrintGCDetails 开启GC日志创建更详细的GC日志 ,默认情况下,GC日志是关闭的

  2. -XX:+PrintGCTimeStamps,-XX:+PrintGCDateStamps

    开启GC时间提示

    • 开启时间便于我们更精确地判断几次GC操作之间的时两个参数的区别
    • 时间戳是相对于 0 (依据JVM启动的时间)的值,而日期戳(date stamp)是实际的日期字符串
    • 由于日期戳需要进行格式化,所以它的效率可能会受轻微的影响,不过这种操作并不频繁,它造成的影响也很难被我们感知。
  3. -XX:+PrintHeapAtGC 打印堆的GC日志

  4. -Xloggc:E:/logs/gc.log 指定GC日志路径

这里以我的订单模块做例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7OstqC0z-1681390080621)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020144136590.png)]

在E盘新建文件夹 logs

然后启动订单模块就可以看见gc日志

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKFFva0F-1681390080621)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020144813361.png)]

gc日志分析网站 https://gceasy.io/

把gc文件上传到这里

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Bags7vc-1681390080622)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020145148294.png)]

这里点下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxHNyLl9-1681390080622)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020145439980.png)]

2.2.1 JVM内存占用情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5499pVab-1681390080622)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020145723837.png)]

Generation【区域】Allocated【最大值】Peak【占用峰值】
Young Generation【年轻代】416mb386mb
Old Generation【老年轻代】369mb95.62mb
Meta Space【元空间】1.08gb92.17mb
Young + Old + Meta space【整体】5.06gb532.64mb

2.2.2 JVM关键性能指标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hp3idpiP-1681390080622)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020145759829.png)]

1 、吞吐量: 百分比越高表明GC开销越低。这个指标反映了JVM的吞吐量。

2 、GC 延迟Latency

  • Avg Pause GC Time: 24.3 ms 平均GC暂停时间
  • Max Pause GC Time: 130 ms 最大GC暂停时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2JAJtFe-1681390080623)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020155424285.png)]

可以看出,刚开始的时候就出现发生了4次full gc,这很明显是不正常的。

2.2.3 GC 统计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2cyRD5l-1681390080623)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020155903305.png)]

在这里插入图片描述

2.2.4 GC原因

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Oa6WIxJ-1681390080623)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020160033288.png)]

3.解决方案(Jvm调优)

则其他堆空间的分配,基于以下规则来进行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJ1B3eFH-1681390080624)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020163010125.png)]

有上图可知 新年代的空间大小为386mb

  • 堆内存:参数-Xms和-Xmx,建议扩大至3-4倍FullGC后的老年代空间占用。
    • 386mb * (3-4) = (1158-1544)MB ,设置heap大小为1544MB;
  • 元空间:参数-XX:MetaspaceSize=N,设置元空间大小为128MB;
    • 不设置:新生代和老年代比例:1 : 2

所以新的参数调整

    -Xms 1544M

    -Xmx 1544M

    -XX:MetaspaceSize=128m

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWMjCMVf-1681390080624)(JVM%E8%B0%83%E4%BC%98.assets/image-20221020164558570.png)]

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

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

相关文章

软件质量保证与软件测试 第五周(数据流测试)+第六周(集成测试开了个头)

数据流测试 1 定义/使用测试 一些概念的定义 例题理解概念 例子1: 定义清除的理解:就是说,如果路径上又遇到了其他定义节点,那就不是。 例子2: 第一步:先画程序图: 第二步:再…

什么是 AWS Lambda 冷启动问题?

什么是 AWS Lambda 冷启动问题? AWS Lambda 是一个无服务器计算平台,使开发人员能够快速构建和部署应用程序,而无需管理任何底层基础设施。但是,这种便利性也带来了一个缺点,即 AWS Lambda 冷启动问题。由于冷启动问题…

sgg第二天Java的语法

关键字 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义  特点:关键字中所有字母都为小写  注意,关键字不能被用作标识符! 保留字 Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使 …

Qt Quick - 弹出控件综述

Qt Quick - 弹出控件综述一、概述一、抽屉控件二、菜单控件三、弹出控件四、工具提示控件一、概述 控件功能Dialog带有标准按钮和标题的弹出式对话框,用于与用户进行短期交互Drawer可以用滑动手势打开和关闭的侧面板Menu弹出式菜单,可以用作上下文菜单或…

springboot事务

对于从事 java 开发工作的同学来说,spring 的事务肯定再熟悉不过了。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据…

设备是如何实现延时关机的

文章目录1. 引言2. 延时关机的实现方式2.1 自建定时服务实现2.2 RocketMQ中间件实现2.2.1 生成端demo2.2.2 消费端demo3. 结尾1. 引言 在设备联动中,有些场景需要保持设备继续工作一段时间再关机。比如在厨房场景下,存在燃气灶和烟机的联动场景&#xf…

基于kettle部署图形化界面(spoon)

最近使用kettle部署windows,mac、linux服务遇到的坑做一个总结。 1、mac、linux部署: 1⃣️拉取docker镜像 docker pull hiromuhota/webspoon 2⃣️创建并运行docker容器 docker run -d -p 8080:8080 hiromuhota/webspoon --name webspoon --restar…

HTML:彩虹按钮

彩虹按钮&#xff08;盗版按钮&#xff0c;B站仿写&#xff0c;略有不同&#xff01;&#xff09; 链接 <html><head><title>demo</title><style>*{margin: 0;padding: 0;}body{display: flex;justify-content: center;align-items: center;…

【hello Linux】Linux软件管理器yum

目录 1.Linux软件管理器yum 1.1 关于lrzsz 1.2 使用yum时的注意事项 1.3 查看软件包&#xff1a;yum list 1.4 安装软件&#xff1a;yum install 1.5 卸载软件&#xff1a;yum remove 1.6 更新yum源 1.7 实战项目 Linux&#x1f337; 1.Linux软件管理器yum 在windows系统下有应…

交友项目【查询黑名单人员,移除黑名单人员】功能实现

目录 1&#xff1a;交友项目 1.1&#xff1a;查询黑名单人员 1.1.1&#xff1a;接口地址 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;移除黑名单人员 1.2.1&#xff1a;接口地址 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&am…

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

0416 leetcode每日一题 1042. 不邻接植花

题目描述&#xff1a; 力扣 思路&#xff1a; 从题目描述中可知&#xff0c;花的种类一共有四种&#xff0c;且一定有满足题意的答案。 可以首先将所有花园中的花设置为0&#xff0c;然后遍历与其相邻的花园&#xff0c;选择没有使用过的花的种类&#xff08;1 2 3 4&#xf…

【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ​ ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 ​编辑 医疗领域…

LeetCode_单调栈_中等_1019.链表中的下一个更大节点

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给定一个长度为 n 的链表 head。对于列表中的每个节点&#xff0c;查找下一个更大节点的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第一个节点的值&#xff0c;这个节点的值严格大于它的值…

Vue项目创建流程

一、安装Vue和查看Vue版本 1.1安装Vue npm i -g @vue/cli1.2 查看Vue Vue -V二、新建一个Vue项目 2.1 使用命令创建项目 vue create vue-project # vue-project是项目名称Default 表示使用默认配置,默认勾选babel、eslint ,回车之后直接进入装包 Manually 自定义勾选特性…

Vector - CAPL - CAN x 总线信息获取(续2)

继续.... 目录 ErrorFrameCount -- 错误帧数量 代码示例 ErrorFrameRate -- 错误帧速率 代码示例 ExtendedFrameCount -- 扩展帧数量 代码示例 ExtendedFrameRate -- 扩展帧速率 代码示例 ExtendedRemoteFrameCount -- 远程扩展帧数量 代码示例 ExtendedRemoteFrameRa…

01背包的算法设计和代码实现以及01背包问题的复杂度计算

01背包的算法设计和代码实现以及01背包问题的复杂度计算 1.算法分析 01背包问题是一个经典的动态规划问题&#xff0c;其目标是在给定一组物品和一个背包容量的情况下&#xff0c;选择一些物品放入背包中&#xff0c;使得背包容量最大化。以下是01背包问题的算法设计和代码实…

Python中的8种运算符

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座…

【消息队列】聊一下Kafka副本机制

副本机制的好处 副本在分布式系统下&#xff0c;不同的网络互联的机器保存同一份数据。我们知道在分布式系统中&#xff0c;都会通过数据镜像、数据冗余的方式来提升高可用性。 提供数据冗余&#xff1a;这点比较好理解&#xff0c;说白了就是通过数据冗余在不同的服务器上&a…

使用Github+picGo搭建图床,超详细教程

超详细教程使用GitHubPicGo搭建图床配置GitHub创建图床仓库生成token配置PicGo下载配置配置Typora打开Typora的设置设置picgo的监听端口号使用GitHubPicGo搭建图床 起因&#xff1a;gitee的图床挂了&#xff0c;原因是gitee的防盗链&#xff0c;所以就打算更换图床&#xff0c…