GCViewer使用教程

什么是GCViewer

GCView是一个可以将jvm中的gc log可视化的工具,使用该工具可以帮助你充分的发现jvm垃圾回收中的潜在问题,让你可以更加准确的做出关于jvm优化的决策。当前提是你必须得先了解jvm垃圾回收的相关概念和理论。注意:GCViewer不适合还不熟悉jvm垃圾回收原理的人使用。

目前来说GCView可以支持由 Sun / Oracle, IBM, HP and BEA 等公司出品的jvm产生的gc log数据。本文将会以openjdk为例来详细讲解GCViewer的基本使用,以及如何使用GCViewer发现潜在问题。

如何使用GCViewer

1.开启gc log

巧妇难为无米之炊,首先你得要有日志才能给GCViewer分析。

  • Spring Boot

假设你使用的是springboot,直接使用java -jar的方式启动,那么开启gc log的方式非常简单。只需要在启动命令加如下参数就可以在启动目录中找到gc.log的文件。

1
java  -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -jar xxxx.jar
  • Apache Tomcat

假设你用的是传统的web部署方式,放到tomcat里面启动,那么可以通过修改bin/catalina.sh这个文件来开启gc log。

1
JAVA_OPTS='-Xloggc:/tmp/gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails'

如果JAVA_OPTS变量以及存在,则在追加这些参数就好了。

记住gc log必须要收集一定的时间才有分析价值,如果只有5-10分钟,可能都还没触发一次full gc,所以看不出问题来。

2.下载GCViewer

GCViewer是一款免费的开源软件,可以直接到github中下载。直接下载构建好的jar包即可,不需要在手动打包了,容易出错。

image-20201124211353379

运行java -jar gcviewer-1.36.jar,就打开GCViewer的图形化界面了。

3.打开分析日志

image-20201124213207864

打开你生产的gc log文件,然后你就可以看到一个眼花缭乱的图表了。这个软件比较简单分为两个区域,一个是图标区域,一个是概览区域。

image-20201124213643109

4.如何排查内存问题

概览区域

首先应该看概览区域,而不是图表。概览区域中有一些重要信息用于给您判断是否当前的gc有问题。其中最重要的是pause标签页。

大概的标签意思如下面所示,分为3块:总的gc(full gc + minor gc),full gc和minor gc。

  • Accumulated pauses:总的暂停时间(暂停期间,你什么都干不了)。

  • Number of pauses:暂停的次数

  • Avg Pause:平均暂停时间

  • Min/Max Pause:最大和最小的暂停时间

  • Avg pause interval:平均暂停的间隔时间

  • Min/max pause interval:最大和最小的暂停间隔时间

如果你的full gc平均的暂停时间很长(大于1s),或者平均暂停间隔非常的短(小于10s),说明可能你的gc回收是有问题的,可能需要优化。

图表区域

具体每个曲线的地方代表什么意思官网都讲的很清楚了。我这里就不在赘述。我主要讲一讲如何看是否gc有问题。

  • 黑色的长线表示full gc,这样的线越少越好。

image-20201124220347768

  • 底部黑色的短线代表的是minor gc,也不应该过于频繁。如果太频繁的话,考虑增大新生代的内存大小。

image-20201124220538707

  • 每次full gc之后,老年代不应该大量的淘汰,否则证明新生代的对象被过早的提升到了老年代。

image-20201124220809936

  • 新生代产生对象的速率过高,可以排除代码哪里有问题,或者看是否是流量激增导致。

image-20201124221050126

  • 老年代内存占用率本身已经接近最大值时,full gc并未给老年代减少空间,那么说明老年代空间不够了。

原文地址:https://www.jdkdownload.com/gcviewer_tutorials.html