上节介绍了GC日志的打印及含义,但是Gc日志看起来比较麻烦,本节将会介绍一下GC日志可视化分析工具GCeasy和GCviewer等。通过Gc日志可视化分析工具,我们可以很方便的看到JVM各个分代的内存使用情况、垃圾回收次数、垃圾回收的原因、垃圾回收占用的时间、吞吐量等,这些指标在我们进行JVM调优的时候是很有用的。

如果想把GC日志存到文件的话,是下面这个参数:
-Xloggc:/path/to/gc.log
然后就可以用一些工具去分析这些gc日志。
代码例子:

  1. package studies.oom;
  2. import jdk.internal.org.objectweb.asm.ClassWriter;
  3. import jdk.internal.org.objectweb.asm.Opcodes;
  4. /**
  5. * @Date: 2021/5/27
  6. * @Time: 8:23
  7. * @BelongsProject base
  8. * @BelongsPackage studies.oom
  9. * java.Lang.outofMemoryError: Metaspace异常演示:
  10. * -Xms60m -Xmx60m -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:d:/metaspaceOOM.log
  11. * 配置上面的设置可以生成GC日志文件
  12. */
  13. public class MetaspaceOOM extends ClassLoader{
  14. public static void main(String[] args) {
  15. int j = 0;
  16. try {
  17. MetaspaceOOM test = new MetaspaceOOM();
  18. for (int i = 0; i < 10000; i++){
  19. //创建CLasswriter对象,用于生成类的二进制字节码
  20. ClassWriter classWriter = new ClassWriter(0);
  21. //指明版本号,修饰符,类名,包名,父类,接口
  22. classWriter.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"Class"+i,null,"java/lang/Object",null);
  23. //返回byte[]
  24. byte[] code = classWriter.toByteArray();
  25. //类的加载,Class对象
  26. test.defineClass("Class"+i,code,0,code.length);
  27. }
  28. }finally {
  29. System.out.println(j);
  30. }
  31. }
  32. }
  1. package com.study.oom;
  2. /**
  3. * 测试生成详细的日志文件
  4. * -Xms60m -Xmx60m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC
  5. * -Xloggc:d:/GCLogTest.log
  6. */
  7. import java.util.ArrayList;
  8. public class GCLogTest {
  9. public static void main(String[] args) {
  10. ArrayList<byte[]> list = new ArrayList<>();
  11. for (int i = 0; i < 5000; i++){
  12. byte[] arr = new byte[1024 * 50];//50kb
  13. list.add(arr);
  14. try {
  15. Thread.sleep(30);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }

一、GCeasy

基本概述

GCeasy—一款超好用的在线分析GC日志的网站
官网地址: https://gceasy.io/ GCeasy是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄漏检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用的(有一些服务是收费的)。
image.png
image.png

二、GCViewer

2.1-基本情况

上面介绍了一款在线的Gc日志分析器,下面介绍一个离线版的GCViewer。

GCViewer是一个免费的、开源的分析小工具,用于可视化查看由SUN/oracle,IBM,HP和BEA,Java虚拟机产生的垃圾收集器的日志。
GCViewer用于可视化Java VM选项-verbose:gc和.NET生成的数据-Xloggc:。它还计算与垃圾回收相关的性能指标(吞吐量,累积的暂停,最长的暂停等)。当通过更改世代大小或设置初始堆大小来调整特定应用程序的垃圾回收时,此功能非常有用。

2.2-安装

1.下载GCViewer工具
源码下载: https://github.com/chewiebug/GCViewer
运行版本下载: https://github.com/chewiebug/GCViewer/wiki/Changelog

2.只需双击gcviewer-1.3x.jar或运行java -jar gcviewer-1.3x.jar(它需要运行java1.8 vm),即可启动GcViewer (gui)

三、其他工具

GChisto

官网上没有下载的地方,需要自己从SVN上拉下来编译不过这个工具似乎没怎么维护了,存在不少bug

HPjmeter

工具很强大,但只能打开由以下参数生成的GC log,-verbose:gc-Xloggc:gc.log。添加其他参数生成的gc.log无法打开
HPjmeter集成了以前的HPjtune功能,可以分析在HP机器上产生的垃圾回收日志文件