天天看点

GC日志分析神器-GCEasy详解

前言

GCEasy是一款非常好用的在线分析GC日志的工具,打开官网,直接上传gc日志,也可以更加上门的要求进行压缩上传。

GC日志分析神器-GCEasy详解

JVM memory size(jvm内存大小区域)

GC日志分析神器-GCEasy详解

JVM memory size ,GCEasy展示了年轻代、老年代、元空间。JVM给分配的大小和程序运行过程中使用的峰值大小。

从JVM memory size展示的信息,我们可以判断是否需要做下面的几件事情。

  • 是否需要修改JVM内存(-Xms、-Xmx、-Xmn…)相关配置,比如年轻代和老年代峰值远远小于分配的大小,这个时候我们可以适当的减小内存设置。
  • 是否需要调整年轻代和老年代的比例(-XX:NewSize(-Xns)、-XX:MaxNewSize(-Xmn)、-XX:SurvivorRatio=8)。比如老年大的峰值一直小于老年代申请的内存,这个时候我们可以稍微多分点空间给年轻代。
  • 是否需要修改元空间(XX:MetaspaceSize,-XX:MaxMetaspaceSize)相关设置。

    年轻代,老年代属于堆区,元空间属于非堆区(直接对接的是机器的内存)

Key Performance Indicators(关键性能指标)

Throughput表示的是吞吐量

Latency表示响应时间

Avg Pause GC Time 平均GC时间

Max Pause GC TIme 最大GC时间

GC日志分析神器-GCEasy详解

Key Performance Indicators 给我们展示了GC吞吐量(应用程序线程用时占程序总用时的比例,越高越好),每次GC的平均耗时(建议控制在50ms以下),GC最长耗时,每个时间段的GC次数及占比信息。

通过Key Performance Indicators显示的信息里面,我们需要关注下面几个问题:

  • 吞吐量,应用花在非GC上的时间百分比(引用花在生产任务上的百分比)。所以吞吐量越高越好。
  • 每次GC的平均耗时。越小越好,建议50ms以下。
  • GC最长耗时。越小越好。如果你的应用是一个后台程序,并且任何请求不超过10秒,那么GC最长耗时就不能超过10秒。

根据内存调优准则,以上这三个优化指标,最多只能三者取其二

  • 如果想要比较好的吞吐量和延迟,就需要在CPU消耗有所牺牲
  • 入股想要比较好的吞吐量和CPU消耗,就需要在延迟上有所牺牲
  • 如果想要比较好的延迟和CPU消耗,就需要在吞吐量上有所牺牲

Interactive Graphs(交互圈)

Interactive Graphs展示了

Heap after GC:GC之后堆的使用情况

Heap before GC:GC之前堆的使用情况

GC Duration:GC持续时间

Reclaimed Bytes:GC回收掉的垃圾对象的内存大小

Young Gen:年轻代堆的使用情况

Old Gen:老年代堆的使用情况

Meta Space:元空间的使用情况

A & P:每次GC的时候堆内存分配和晋升情况。其中红色的线表示每次GC的时候年轻代里面有多少内存(对象)晋升到了老年代。

第一部分是Heap after GC,GC后堆的内存图,堆是用来存储对象的,从图中可以看出,随着GC的进行,垃圾回收器把对象都回收掉了,因此堆的大小逐渐增大。

GC日志分析神器-GCEasy详解

第二部分是Heap before GC,这是GC前堆的使用率,可以看出随着程序的运行,堆使用率越来越高,堆被对象占用的内存越来越大。

GC日志分析神器-GCEasy详解

第三部分是GC Duration Time,就是GC持续时间。一个GC事件的发生具有多个阶段,而不同的垃圾回收器又有不同的阶段,这里展示不作细分。这些阶段(例如并发标记,并发清除等)与程序线程一起并发运行,此时不会暂停程序线程。但是某些阶段(例如初始标记,清除等)会暂停整个应用程序,所以此图标描述的仅暂停阶段所花费的时间。

GC日志分析神器-GCEasy详解

第四部分表示的是GC回收掉的垃圾对象的内存大小。

GC日志分析神器-GCEasy详解

第五部分表示的是Young Gen,年轻代的内存分配情况。对象都是朝生夕死,年轻代存放的就是刚刚产生的对象,每进行一次GC,都会GC掉很多垃圾对象,剩下的就是右GC Root关联的对象,这些对象会年龄会逐渐增加,达到了一定阈值就会晋升为老年代的对象。可以看到before GC表示的图线随着时间的进行逐渐增大,也就是年轻代中对象越来越多,而GC事件发生后,年轻代中对象就会减少,也就是after GC图线表示的内存变化趋势。

GC日志分析神器-GCEasy详解

第六部分是Old Gen,表示的是老年代的内存分配情况。细心的读者会发现,为啥一开始before GC的内存大小比after GC的内存分配要少呢?这里得先知道老年代存放的都是年龄大的对象,意思就是经过了多次GC都没有被GC掉的对象,就会晋升为老年代的对象。所以这就解释了为啥after GC内存要比before GC内存要大,因为每次GC过后,都会有年轻代的对象晋升为老年代对象。

GC日志分析神器-GCEasy详解

第七部分是每次GC的时候堆内存分配和晋升情况。其中红色的线表示每次GC的时候年轻代里面有多少内存(对象)晋升到了老年代。

GC日志分析神器-GCEasy详解

GC Statistics(GC统计信息)

GC日志分析神器-GCEasy详解

GC Statistics显示一些GC的统计信息。每种GC总共回收了多少内存、总共用了多长时间、平均时间、以及每种GC的单独统计信息啥的。

Object Stats(对象的一些统计信息)

GC日志分析神器-GCEasy详解

GC Causes(GC的原因信息)

GC日志分析神器-GCEasy详解

Memory Leak

由于记录的程序没有内存泄漏,所以这里就没有内存泄漏的日志信息。此处可以诊断8种OOM中的5种(Java堆内存溢出,超出GC开销限制,请求数组大小超过JVM限制,Permgen空间,元空间)。

继续阅读