文章目录
- 概要
- 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调优的问题