[转帖]GC日志分析工具——GCViewer案例

一、GCViewer介绍

业界较为流行分析GC日志的两个工具——GCViewer、GCEasy。GCEasy部分功能还是要收费的,今天笔者给大家介绍一下GCViewer的使用与功能点。

二、GCViewer 使用

2.1 编译

首先,在github上搜索GCViewer项目,并下载到本地。GCViewer项目没有提供现成的release版本,利用如下maven编译命令即可完成GCViewer的编译工作,最终生成一个gcviewer-1.36.jar。

mvn clean install -DskipTests

注:

  • 官网上给出的maven命令并没有-DskipTests,笔者在编译过程中tests部分有异常导致编译失败,因此添加了-DskipTests。
  • 在编译时,有异常表示要依赖git、svn,因此在编译前请安装这两个软件。

为了方便看官们去使用该工具,笔者将编译好的jar,存放百度网盘,欢迎下载。

链接:https://pan.baidu.com/s/1CCX6bg3zw-HtcX5Ls9CBXQ 提取码:ea5q

2.2 GCViewer介绍

双击gcviewer-1.36.jar,即可见到主界面,如下图:

接着,选择要分析的gc日志文件,即可出现分析界面,主要关注Chart、Event detail、summary/memory/pause三个标签页。

2.2.1 Chart

Chart标签页把每次GC的采集信息,转换成图表用以展示,包括堆的总大小、堆的使用量、单次full gc的时间等(有些折线是特定GC收集器所特有的)。

乍一看该图形,有点乱乱的感觉,大家可以点击工具栏中的view,选择自己感兴趣的曲线,如下所示:

2.2.2 Event detail

Event detail标签页如下图所示,展示了minor GC和full GC触发的原因、次数、最长时间、最短时间等信息。

由图可知

触发Young CG的原因有:

  • allocation failure,年轻代没有足够的内存去存放对象。
  • gclocker failure,JNI临界区被释放时会触发一次GC。

触发Full GC的原因有:

  • ergonomics,当新生代要晋升到老年代的占用空间,要大于老年代剩余内存空间时,便会触发full gc。
  • metadata gc threshold,metadata空间不够用时,便会触发一次full gc。(metadata的初始值可以使用java -XX:+PrintFlagsInitial命令来看看)
  • Heap Dump Initiated GC,执行jmap -dump:live pid,或jstat -gccause pid。
  • system gc,显示调用了System.gc()。

2.2.3 Summary、Memory、Pause

  • 进程运行66+h。
  • heap最大使用率达到 99.8%。
  • full gc最多的一次回收了14G heap。

  • 老年代最大使用率达到100%。
  • 新生代最大使用率达到99.7%。
  • 灰色部分参数由于JVM参数设置原因,没有相应的值。

Pause标签页展示的信息与Event detail标签页高度重合。

三、参考链接

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html