Bootstrap

jvm-问题分析及优化利器-gceasy的使用

什么是gceasy?

    gceasy是一个网站 :https://gceasy.io/ 主要为分析gc日志,形成可视化的报表快速排查问题使用。并且可以推荐jvm优化的配置(当然这块收费了!!!)。

官网介绍:

通用GC 日志分析器

业内首款借助机器学习技术引导的垃圾回收日志分析工具。GCeasy 内置有智能功能,可自动检测 JVM 和 Android GC 日志中的问题并推荐解决方案。

  •     仅需几秒钟即可解决内存和 GC 问题

  •     获取 JVM 堆内存设置建议

  •     获取 JVM 堆内存设置建议 上传 GC 日志文件

  •     深受 4,000+ 企业信赖

8eea0dca0ceebb6b957e0cf568c6cc2f.png

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

启动配置:

cae8ad3c5e95f676e92fcbaa5362aea5.png

010ed3433e57ecb9a8cffc0903e7f835.png

7ecd8c4528a6028792b6042b834d8006.png

通过手动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

运行程序后会生成如下:

f742fca5f7c0a50ba89f908c2bcadfee.png

08f09938010649c2697482c499363ceb.png

def730af3283c3a28abf9e849a84588c.png

(貌似这种错误和jump出来的 easy都不支持~,算是一种分析问题的操作吧,暂时不删除了~)

75440b809c36590251d8fb23787f1da0.png

通过以上生成的log然后上传到gceasy,这里发现用中文的版本可以免费获取到分析的推荐配置参数,不知道是随机还是只有中文有,大家可以切换到中文版尝试尝试~

结果分析:

    GCeasy还是比较人性化的,可以分享和将报告下载下来分析;重点是这个建议:提示如何进行优化这个还是很给力气,所有的其他功能我们都可以通过jdk自带的工具实现,唯一这里的推荐就是这个平台的一大利器,不过听说英文版开始收费了~所以想用的同学尽快上学,说不定将来也都收费了~

309a2736b6f31240c57f3773b1f867c3.png

JVM内存大小

db42cdb2670728cd9a63fe9dd0088b20.png

那上面这块就是分析出来具体你的jvm的年轻代和老年代,元空间及总合,这里就不多说什么,不清楚的同学可以看看我前面的文章~(元空间

关键性能指标

5db9a893a1d20fe3a100b8f6fcdd3c5d.png

从上面可以看到两个指标,一个是平均停顿时间,一个是最大停顿时间,一般我们一次GC在80ms以内都算是优秀了,正常几百ms也有,不过如果这个值很大,几千那就要注意了是不是频繁fullgc 要看下面的老年代gc了,或者这个值分配不均匀那更要注意了是不是代码里面有大对象直接进入老年代或者代码方面引起的问题。

交互图表

注意这里的GC后的堆情况,如果你拿到的日志非常大,发现你的堆一直在往上增加,那就证明你的代码有一些对象一直往老年代里面存放,并且不删除,导致老年代内存占用空间一直越来越大,一般正常情况下是每次gc完会有一个减少的情况,如果是前面说的这种就要注意了,你可能就是内存快溢出了就是常说的OOM(这个demo就是oom)

e86e9493fce2c2abb591f1c2847242f6.png

f6e88c0008718977d627c9d6c790d15f.png

从这张图可以看到下面如果gc持续的时间有异常或者说很大超过1s或者有时高有时低,那就要注意了~

cd01d5524d14790d8668519a70ecfa1b.png

可以看到每次gc回收的字节数,仅供参考。

3b36af1f032a68563a7173729b9a0793.png

可以从图中看到每次younggc之前、之后以及gc释放的数量。

191ffa502d62f2256c0b4a20cdee9181.png

可以从图中看到每次younggc之前、之后以及gc释放的数量。

037eeda844c1f44ac65a300ca467ac04.png

老年代回收前后回收后的情况,如果这里一直在增加,就要注意喽~

5aab5031f28444661e8763f67fde08cd.png

元空间,jdk8后去除永久代改为元空间,就是直接内存,这块要注意下是否越占越大,因为内存也是会满的~

62bb9f6f25c28ac75d1462c0abac44e1.png

可以从这里看到对象分配大小以及回收的大小~

4d26349d5a443507a6600640c20a10bd.png

GC统计数据

9131ea5b403f58597348f68fb3262026.png

GC的总次数:Total GC count ;

Minorgc次数:Minor GC count;

Full GC次数:Full GC Count;

GC导致停顿次数:Pause Count;

当然了,各项指标可以详细去了解,不一一列举,那么这张图可以干什么呢?第一可以看到具体每次gc次数,特别注意full gc ,其次看到停顿次数及停顿时间,如果这里太明显了,那么就要针对性来分析了~

对象数据

a61431ca9d36a825e5a94bb7b8c4f85b.png

方便参考值

3014f9829d0009c705e616b7f525792c.png

这个功能就好用了,可以直接看出来有没有内存泄漏,如果有的话直接提示在这里了。~

4f5e969de8f07e2e1f22d3020fd5601c.png

e6f7da86edd481463687b668ceae9c1e.png

    上面这些作为参考的数据,比如JVM参数配置,这块可以看出来你的jvm配置有没有生效,其次你的GC原因可以看出你具体是拓展空间的gc或者是程序的gc等等~

最后

    其实GCeasy大部分功能我们都可以通过Jdk自带的bin目录中获取实现,GCeasy只是在这些基础上进行封装成图形化界面,让我们一眼可以看懂很多系统的指标和分析问题,但是GCeasy最强大的莫过于推荐配置这块功能,可以提供我们参数的配置,减少我们大量尝试的时间,所以这块真的太给力了,有时候为了优化频繁的fullgc或者分析一些代码引发的问题找半天,但是通过GCeasy可以很清晰分析出来是代码还是业务量增加的导致的需要优化,当然了GCeasy后续也开始收费了,所以各位有钱的同学或公司可以付费参与我觉得也是可以减少大量的分析时间也挺值。(不过各大云平台貌似都有免费的功能)

5c273c13ae52de8a1b45db336cc0245c.png

;