背景
最近对负责的项目进行了一次性能优化,其中包括对 JVM 参数的调整,算是进行了一次简单的 JVM 调优,JVM 参数调整之后,服务的整体性能有 5% 左右的提升,还算不错。
先介绍一下项目的基本情况:
项目是一个高 QPS 压力的 web 服务,单机 QPS 一直维持在 1.5K 以上,由于旧机器的”拖累”,配置的堆大小是 8G,其中 young 区是 4G,垃圾回收器用的是 parNew + CMS。
旧状
首先是查看当前 GC 的情况,主要是使用 jstat
查看 GC 的概况,再查看 gc log,分析单次 gc 的详细状况。
使用 jstat -gcutil pid 1000
每隔一秒打印一次 gc 统计信息。
可以看到,单次 gc 平均耗时是 60ms 左右,还算可以接受,但 YGC 非常频繁,基本上每秒一次,有的时候还会一秒两次,在一秒两次的时候,服务对业务响应时长的压力就会变得很大。
接着查看 gc log,打印 gc log 需要在 JVM 启动参数里添加以下参数:
-
-XX:+PrintGCDateStamps
:打印 gc 发生的时间戳。 -
-XX:+PrintTenuringDistribution
:打印 gc 发生时的分代信