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日志路径

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

java超详细的jvm调优_第1张图片

在E盘新建文件夹 logs

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

java超详细的jvm调优_第2张图片

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

把gc文件上传到这里

java超详细的jvm调优_第3张图片

这里点下载

java超详细的jvm调优_第4张图片

2.2.1 JVM内存占用情况

java超详细的jvm调优_第5张图片

Generation【区域】 Allocated【最大值】 Peak【占用峰值】
Young Generation【年轻代】 416mb 386mb
Old Generation【老年轻代】 369mb 95.62mb
Meta Space【元空间】 1.08gb 92.17mb
Young + Old + Meta space【整体】 5.06gb 532.64mb

2.2.2 JVM关键性能指标

java超详细的jvm调优_第6张图片

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

2 、GC 延迟Latency

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

java超详细的jvm调优_第7张图片

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

2.2.3 GC 统计

java超详细的jvm调优_第8张图片

java超详细的jvm调优_第9张图片

2.2.4 GC原因

java超详细的jvm调优_第10张图片

3.解决方案(Jvm调优)

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

java超详细的jvm调优_第11张图片

有上图可知 新年代的空间大小为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

java超详细的jvm调优_第12张图片

你可能感兴趣的:(jvm,java,开发语言)