解析一行gc日志

版权声明:本文为博主原创文章 http://blog.csdn.net/su20145104009 https://blog.csdn.net/su20145104009/article/details/85061967

线上某个项目 ,启动参数

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/opt/logs/spring-boot/gc.log

在gc.log里面发现了这些gc信息

315201.296: [GC (Allocation Failure) 315201.296: [ParNew: 1751390K->80739K(1887488K), 0.0101556 secs] 2491410K->820942K(3984640K), 0.0102680 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
318743.612: [GC (Allocation Failure) 318743.612: [ParNew: 1758563K->59949K(1887488K), 0.0147964 secs] 2498766K->800188K(3984640K), 0.0148845 secs] [Times: user=0.07 sys=0.00, real=0.01 secs]
318775.604: [GC (Allocation Failure) 318775.604: [ParNew: 1737773K->68351K(1887488K), 0.0123685 secs] 2478012K->808592K(3984640K), 0.0124858 secs] [Times: user=0.07 sys=0.00, real=0.01 secs]
318802.834: [GC (Allocation Failure) 318802.834: [ParNew: 1746175K->69771K(1887488K), 0.0116771 secs] 2486416K->811408K(3984640K), 0.0117842 secs] [Times: user=0.07 sys=0.00, real=0.01 secs]
322350.761: [GC (Allocation Failure) 322350.761: [ParNew: 1747595K->63162K(1887488K), 0.0167381 secs] 2489232K->814601K(3984640K), 0.0168509 secs] [Times: user=0.07 sys=0.00, real=0.02 secs]
322381.402: [GC (Allocation Failure) 322381.402: [ParNew: 1740986K->51842K(1887488K), 0.0129548 secs] 2492425K->803283K(3984640K), 0.0130594 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
322404.064: [GC (Allocation Failure) 322404.064: [ParNew: 1729666K->55762K(1887488K), 0.0115347 secs] 2481107K->807314K(3984640K), 0.0116484 secs] [Times: user=0.07 sys=0.00, real=0.01 secs]

堆信息为:

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 2147483648 (2048.0MB)
   MaxNewSize               = 2147483648 (2048.0MB)
   OldSize                  = 2147483648 (2048.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 134217728 (128.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 134217728 (128.0MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 1932787712 (1843.25MB)
   used     = 473374352 (451.44496154785156MB)
   free     = 1459413360 (1391.8050384521484MB)
   24.491792298811966% used
Eden Space:
   capacity = 1718091776 (1638.5MB)
   used     = 453233264 (432.23692321777344MB)
   free     = 1264858512 (1206.2630767822266MB)
   26.380038035872655% used
From Space:
   capacity = 214695936 (204.75MB)
   used     = 20141088 (19.208038330078125MB)
   free     = 194554848 (185.54196166992188MB)
   9.381215301625458% used
To Space:
   capacity = 214695936 (204.75MB)
   used     = 0 (0.0MB)
   free     = 214695936 (204.75MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 2147483648 (2048.0MB)
   used     = 815511248 (777.7321319580078MB)
   free     = 1331972400 (1270.2678680419922MB)
   37.9752017557621% used

首先对堆信息进行简单介绍。使用的cms垃圾收集,最大堆大小MaxHeapSize4G.NewRatio大小为2,所以可知年轻代大小和年老代大小均为2G.
SurvivorRatio=8 ,所以可知Eden区大小为2G/(8+1+1)*81638.4M.s0和s1大小分别为:204.8M
而在参数中我们可以发现 New Generation的大小等于Eden + 1 Survivor Space
是因为S区只有一个s0或者s1可用。
下面对于第一条日志进行解析

315201.296: [GC (Allocation Failure) 315201.296: [ParNew: 1751390K->80739K(1887488K), 0.0101556 secs] 2491410K->820942K(3984640K), 0.0102680 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

GC (Allocation Failure) 315201.296
gc: 区别发生的是minor gc (ygc)还是major gc (即full gc) 此次是发生的minor gc (ygc)
(Allocation Failure): gc的原因是 eden区剩余空间不足分配对象
315201.296 : gc发生的时间(从jvm的启动时间开始)

[ParNew: 1729666K->55762K(1887488K), 0.0115347 secs] 

ParNew: 表示使用的是ParNew 并行收集器
1729666K 表示gc前年轻代区域空间大小
55762K 表示gc后年轻代空间大小
1729666K 表示年轻代空间可用的总大小(减去一个S区)
0.0115347 secs gc持续的时间 单位秒

2491410K->820942K(3984640K), 0.0102680 secs] 

2491410K 表示整个堆gc前所占用的大小
820942K 表示整个堆gc后所占用的大小
3984640K 表示整个堆的可用大小(减去一个S区)

通过上面可知

eden + 1 survivor space = 1887488K

年轻代(eden + 一个s区 ):空间减少 1751390K - 80739K = 1670651K
总堆空间减少 : 2491410K - 820942K = 1670468K
所以有:1670651K - 1670468K = 183K 大小的对象进入老年代
对于老年代有2G,每次ygc只有183K大小的对象进入老年代,还是可以接受的。

当然 此时即使我们发现minor gc后有对象进行old区,也不清楚是何原因。
可能是s区的对象达到了晋升年龄,
可能是eden区无用对象清理后,剩余对象的大小大于s区空间,部分对象将放入old区,
可能是old区进行分配担保,
如果你想把所有对象留在年轻代,那么就要找原因,然后找对应的处理办法。

猜你喜欢

转载自blog.csdn.net/su20145104009/article/details/85061967