GC日志查看和分析

GC日志查看和分析

GC日志查看

可以通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略。
GC的日志是以替换的方式(>)写入的,而不是追加(>>),如果下次写入到同一个文件中的话,以前的GC内容会被清空。

1.1 参数列表

  • -XX:+PrintGC 输出GC日志
  • -XX:+PrintGCDetails 输出GC的详细日志
  • -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
  • -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
  • -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
  • -Xloggc:../logs/gc.log 日志文件的输出路径

1.2 示例

启动命令:

java -jar -Dspring.profiles.active=dev -Duser.timezone=GMT+8  -Dserver.port=8007 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./logs/gc.log activity-activitys-1.0.jar&

结果:


GC日志查看和分析_第1张图片
gclog.jpg

GC日志分析(理论)

2.1 GC(minor)日志分析

GC日志查看和分析_第2张图片
minorGC_.jpg

2.2 Full GC 日志分析

GC日志查看和分析_第3张图片
FullGC.jpg

GC实际日志分析

3.1

2020-08-12T16:28:04.329+0800: 0.262: [GC (Allocation Failure) [PSYoungGen: 31744K->2422K(36864K)] 31744K->2430K(121856K), 0.0053379 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
  • 2020-08-12T16:28:04.329+0800: gc日志记录时间
  • 0.262: gc发生时,虚拟机运行了多少秒
  • GC (Allocation Failure): 发生了一次垃圾Minor GC,括号里的内容是gc发生的原因,这里的Allocation Failure的原因是年轻代中没有足够区域能够存放需要分配的数据而失败
  • PSYoungGen: 使用的垃圾收集器的名字
  • 31744K->2422K(36864K): 垃圾收集前后的年轻代内存使用情况,其中前面的31744K为gc之前的使用量,2422K为gc之后的内存使用量,括号里的36864K为该内存区域的总量
  • 31744K->2430K(121856K): 垃圾收集前后整个堆内存的使用情况,括号里的为整个可以的堆内存的容量
  • 0.0053379 secs: 整个GC过程持续时间

3.2

2020-08-12T16:28:05.283+0800: 1.216: [GC (Metadata GC Threshold) [PSYoungGen: 245183K->3769K(259072K)] 245295K->6240K(344064K), 0.0087940 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

也是一次minor gc,但是与前两次的gc原因不一样,这次的gc原因是:[Metadata GC Threshold],Metadata即元数据的意思,我们可以看出这是与虚拟机的元数据区有关系的一次gc;元数据区,在jdk1.8以前又叫永久代,从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的就是这里的称为Metaspace的存储空间;元空间和永久代是虚拟机对方法区这个概念的一个具体实现;对于元空间而言,这一块空间是存在本地内存当中的,因此,默认情况下,元空间的大小仅受本地内存限制,但我们可以通过参数来指定元空间的大小

这里元空间发生gc,说明元空间的内存不够了,到达了阀值;对元空间进行了一次垃圾回收,回收之前是245183K,回收之后是3769K

3.3

2020-08-12T16:28:05.292+0800: 1.225: [Full GC (Metadata GC Threshold) [PSYoungGen: 3769K->0K(259072K)] [ParOldGen: 2471K->5990K(53248K)] 6240K->5990K(312320K), [Metaspace: 20587K->20585K(1067008K)], 0.0351661 secs] [Times: user=0.08 sys=0.00, real=0.03 secs] 

在元空间gc之后,紧接着发生了一次Full GC,且触发原因也是元空间不足

  • [PSYoungGen: 3769K->0K(259072K)] : 年轻代进行了一次gc
  • [ParOldGen: 2471K->5990K(53248K)] : 老年代进行了一次gc
  • [Metaspace: 20587K->20585K(1067008K)] : 元空间发生了一次gc,但是,gc前后内存使用情况并没有发生任何改变;同时,元空间总的可使用的内存为:1GB

你可能感兴趣的:(GC日志查看和分析)