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调优典型参数设置;
-
-Xms堆内存的最小值:
- 默认情况下,当堆中可用内存小于40%时,堆内存会开始增加,一直增加到-Xmx的大小。
-
-Xmx堆内存的最大值:
默认值是总内存/64(且小于1G)
- 默认情况下,当堆中可用内存大于70%时,堆内存会开始减少,一直减小到-Xms的大小;
-
-Xmn新生代内存的最大值:
- 1.包括Eden区和两个Survivor区的总和
- 2.配置写法如:-Xmn1024k,-Xmn1024m,-Xmn1g
-
-Xss每个线程的栈内存:
- 默认1M,一般来说是不需要改。线程栈越小意味着可以创建的线程数越多
整个堆的大小 = 年轻代大小 + 年老代大小,堆的大小不包含元空间大小,如果增大了年轻代,年老代相应就会减小,官方默认的配置为年老代大小/年轻代大小=2/1左右;
建议在开发测试环境可以用Xms和Xmx分别设置最小值最大值,但是在线上生产环境,Xms和Xmx设置的值必须一样,防止抖动;
2.2 JVM调优设置合大小堆内存空间
JVM调优设置合大小堆内存空间既不能太大,也不能太小。那么应该设置为多少呢
默认的配置是否存在性能瓶颈。如果想要确定JVM性能问题瓶颈,需要进一步分析GC日志
-
-XX:+PrintGCDetails 开启GC日志创建更详细的GC日志 ,默认情况下,GC日志是关闭的
-
-XX:+PrintGCTimeStamps,-XX:+PrintGCDateStamps
开启GC时间提示
- 开启时间便于我们更精确地判断几次GC操作之间的时两个参数的区别
- 时间戳是相对于 0 (依据JVM启动的时间)的值,而日期戳(date stamp)是实际的日期字符串
- 由于日期戳需要进行格式化,所以它的效率可能会受轻微的影响,不过这种操作并不频繁,它造成的影响也很难被我们感知。
-
-XX:+PrintHeapAtGC 打印堆的GC日志
-
-Xloggc:E:/logs/gc.log 指定GC日志路径
这里以我的订单模块做例子
在E盘新建文件夹 logs
然后启动订单模块就可以看见gc日志
gc日志分析网站 https://gceasy.io/
把gc文件上传到这里
这里点下载
2.2.1 JVM内存占用情况
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关键性能指标
1 、吞吐量: 百分比越高表明GC开销越低。这个指标反映了JVM的吞吐量。
2 、GC 延迟:Latency
- Avg Pause GC Time: 24.3 ms 平均GC暂停时间
- Max Pause GC Time: 130 ms 最大GC暂停时间
可以看出,刚开始的时候就出现发生了4次full gc,这很明显是不正常的。
2.2.3 GC 统计
2.2.4 GC原因
3.解决方案(Jvm调优)
则其他堆空间的分配,基于以下规则来进行。
有上图可知 新年代的空间大小为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