java超详细的jvm调优

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)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有点东西且很多

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值