什么是gceasy?
gceasy是一个网站 :https://gceasy.io/ 主要为分析gc日志,形成可视化的报表快速排查问题使用。并且可以推荐jvm优化的配置(当然这块收费了!!!)。
官网介绍:
通用GC 日志分析器
业内首款借助机器学习技术引导的垃圾回收日志分析工具。GCeasy 内置有智能功能,可自动检测 JVM 和 Android GC 日志中的问题并推荐解决方案。
仅需几秒钟即可解决内存和 GC 问题
获取 JVM 堆内存设置建议
获取 JVM 堆内存设置建议 上传 GC 日志文件
深受 4,000+ 企业信赖
gceasy的使用
打开网站:https://gceasy.ycrash.cn/
首先我们需要通过项目生成的log文件进行提交上传,那么这里使用的的代码是死锁的代码来尝试
package com.jvm.oom;
import java.util.ArrayList;
import java.util.List;
class OOMObject {
public byte[] placeholder = new byte[64 * 1024];
public static void fillHeap(int num) throws InterruptedException {
List<OOMObject> list = new ArrayList<OOMObject>();
for (int i = 0; i < num; i++) {
// 稍作延时,令监视曲线的变化更加明显
Thread.sleep(50);
list.add(new OOMObject());
}
System.gc();
}
public static void main(String[] args) throws Exception {
fillHeap(1000);
}
}
通过运行日志进行分析(GCeasy支持)
配置启动项(不懂可以看之前的文章)
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/Users/csh/hong.log
启动配置:
通过手动Jump进行分析(GCeasy不支持)
csh@chenshuhongdeMacBook-Pro ~ % jps
10080 RemoteMavenServer36
10530 Launcher
10531 OOMObject
10536 Jps
10043
csh@chenshuhongdeMacBook-Pro ~ % jmap -dump:file=/Users/csh/hong.dump 10531
Dumping heap to /Users/csh/hong.dump ...
通过异常退出生成的jump文件进行分析(GCeasy不支持)
通过配置+HeapDumpOnOutOfMemoryError和HeapDumpPath 当系统异常的时候可以获取到对应的dump文件。
-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m -XX:HeapDumpPath=/Users/csh
运行程序后会生成如下:
(貌似这种错误和jump出来的 easy都不支持~,算是一种分析问题的操作吧,暂时不删除了~)
通过以上生成的log然后上传到gceasy,这里发现用中文的版本可以免费获取到分析的推荐配置参数,不知道是随机还是只有中文有,大家可以切换到中文版尝试尝试~
结果分析:
GCeasy还是比较人性化的,可以分享和将报告下载下来分析;重点是这个建议:提示如何进行优化这个还是很给力气,所有的其他功能我们都可以通过jdk自带的工具实现,唯一这里的推荐就是这个平台的一大利器,不过听说英文版开始收费了~所以想用的同学尽快上学,说不定将来也都收费了~
JVM内存大小
那上面这块就是分析出来具体你的jvm的年轻代和老年代,元空间及总合,这里就不多说什么,不清楚的同学可以看看我前面的文章~(元空间)
关键性能指标
从上面可以看到两个指标,一个是平均停顿时间,一个是最大停顿时间,一般我们一次GC在80ms以内都算是优秀了,正常几百ms也有,不过如果这个值很大,几千那就要注意了是不是频繁fullgc 要看下面的老年代gc了,或者这个值分配不均匀那更要注意了是不是代码里面有大对象直接进入老年代或者代码方面引起的问题。
交互图表
注意这里的GC后的堆情况,如果你拿到的日志非常大,发现你的堆一直在往上增加,那就证明你的代码有一些对象一直往老年代里面存放,并且不删除,导致老年代内存占用空间一直越来越大,一般正常情况下是每次gc完会有一个减少的情况,如果是前面说的这种就要注意了,你可能就是内存快溢出了就是常说的OOM(这个demo就是oom)
从这张图可以看到下面如果gc持续的时间有异常或者说很大超过1s或者有时高有时低,那就要注意了~
可以看到每次gc回收的字节数,仅供参考。
可以从图中看到每次younggc之前、之后以及gc释放的数量。
可以从图中看到每次younggc之前、之后以及gc释放的数量。
老年代回收前后回收后的情况,如果这里一直在增加,就要注意喽~
元空间,jdk8后去除永久代改为元空间,就是直接内存,这块要注意下是否越占越大,因为内存也是会满的~
可以从这里看到对象分配大小以及回收的大小~
GC统计数据
GC的总次数:Total GC count ;
Minorgc次数:Minor GC count;
Full GC次数:Full GC Count;
GC导致停顿次数:Pause Count;
当然了,各项指标可以详细去了解,不一一列举,那么这张图可以干什么呢?第一可以看到具体每次gc次数,特别注意full gc ,其次看到停顿次数及停顿时间,如果这里太明显了,那么就要针对性来分析了~
对象数据
方便参考值
这个功能就好用了,可以直接看出来有没有内存泄漏,如果有的话直接提示在这里了。~
上面这些作为参考的数据,比如JVM参数配置,这块可以看出来你的jvm配置有没有生效,其次你的GC原因可以看出你具体是拓展空间的gc或者是程序的gc等等~
最后
其实GCeasy大部分功能我们都可以通过Jdk自带的bin目录中获取实现,GCeasy只是在这些基础上进行封装成图形化界面,让我们一眼可以看懂很多系统的指标和分析问题,但是GCeasy最强大的莫过于推荐配置这块功能,可以提供我们参数的配置,减少我们大量尝试的时间,所以这块真的太给力了,有时候为了优化频繁的fullgc或者分析一些代码引发的问题找半天,但是通过GCeasy可以很清晰分析出来是代码还是业务量增加的导致的需要优化,当然了GCeasy后续也开始收费了,所以各位有钱的同学或公司可以付费参与我觉得也是可以减少大量的分析时间也挺值。(不过各大云平台貌似都有免费的功能)