如何在项目当中进行JVM调优

文章目录

    • 概要
    • gcviewer工具
    • 启动项目并保存gc日志
    • 通过gcviewer工具分析gc日志
    • 小结

概要

在我们的日常工作当中使用JVM的时候,基本上对于调优都是调整堆的内存大小,或者调整使用的垃圾回收器,对于堆的内存大小,其实在我们的固有思维的认知当中认为是越大越好。对于垃圾回收器也是越新越好,其实这个是错误的。对于调优的话,我们可以从两个方向去入手,吞吐量和停顿时间(最大停顿时间、平均停顿时间、最小停顿时间),停顿时间和吞吐量其实就是负相关的,我们需要找到其中的平衡点去做调整,只能尽量满足我们的要求。

  • 停顿时间:当我们在设置堆内存大小时候,有没有想过,其实堆的内存越大,当触发gc时,系统的整个停顿时间就越长,这个很好理解,因为我们要回收的空间变大了,需要更多的时间做回收处理,虽然我们在非回收时间的表现很好,但一旦触发gc时有用户访问就会出现明显的卡顿(旱的旱死,涝的涝死,两个极端)。对于G1来说有一个参数-XX:InitiatingHeapOccupancyPercent,可以设置堆内存占用多少时触发回收,默认是45%。
  • 吞吐量:吞吐量的概念就是 系统处理业务的时间/(系统处理业务时间+gc停顿时间)。理论上是堆越大,整个系统的吞吐量会越大。

gcviewer工具

gcviewer是一个对于gc日志的调优工具,我们可以在github上去下载源码自己编译成jar包,或者直接下载编译好的jar包。GCViewer1.36jar包下载地址
下载好之后我们可以通过java -jar GCViewer1.36jar命令启动gcviewer工具。打开后如下图
在这里插入图片描述

启动项目并保存gc日志

在项目启动之前设置启动参数,具体的参数设置,请参考这篇文章,题主在这里不再赘述,只是教会大家如何使用及分析:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:D:\base\gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=14 -XX:GCLogFileSize=1k
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置完成后,我们启动项目就可以在设置的目录找到打印的gc文件日志。
在这里插入图片描述

通过gcviewer工具分析gc日志

通过gcviewer打开gc.log文件我们就可以看到gc的详细信息
在这里插入图片描述
根据上面的信息,我们可以看到题主的电脑的gc的相关信息,题主使用的默认的堆大小。通过jinfo -pid命令查看一下,16777216/1024/1024=16M的大小。
在这里插入图片描述
接下来我来通过参数-Xms8m -Xmx8m调整一下堆内存大小数据。调整调整了一个比较小的堆内存,只是作为演示,给大家看一下日志的数据。对比上面的数据,我们发现内存过小,吞吐量急剧下降,Gc的时间也变长。
在这里插入图片描述

小结

通过上面的演示,我们就可以知道,我们在做JVM调优时该如何下手,主要关注点是什么,主要需要不断的去调整堆的大小,去不断的将吞吐量和停顿时间调整到我们可以接受的范围之内。这个过程需要不断的去重试,可能需要切换不同的垃圾回收器去做调整。同时当新生代的对象创建后只是短暂使用的这种,我们专门可以去调整新生代的young区的大小,让其在minor gc时尽可能的被回收掉,不要晋升到老年代当中。在不同的场景当中需要我们灵活的去回答JVM调优的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值