FGC的相关问题

1、ParNew (promotion failed)
400355.931: [Full GC 400355.931: [CMS: 1552723K->1552721K(2457600K), 2.2551480 secs] 2652251K->2645071K(3822976K), [CMS Perm : 110912K->110912K(262144K)], 2.2553490 secs] [Times: user=2.24 sy
s=0.01, real=2.26 secs] 
400358.187: [GC 400358.187: [ParNew (promotion failed): 1092352K->1098110K(1365376K), 0.0788340 secs] 2645073K->2650833K(3822976K), 0.0790050 secs] [Times: user=0.78 sys=0.00, real=0.08 secs]
 
400358.266: [Full GC 400358.266: [CMS: 1552723K->1552721K(2457600K), 2.2398770 secs] 2650833K->2645071K(3822976K), [CMS Perm : 110912K->110912K(262144K)], 2.2400760 secs] [Times: user=2.23 sy
s=0.00, real=2.24 secs] 
400360.507: [GC 400360.508: [ParNew (promotion failed): 1092351K->1099388K(1365376K), 0.0774040 secs]400360.585: [CMS: 1552723K->1552721K(2457600K), 2.2632540 secs] 2645073K->2645071K(3822976
K), [CMS Perm : 110912K->110912K(262144K)], 2.3408930 secs] [Times: user=3.00 sys=0.01, real=2.34 secs] 
400362.849: [GC 400362.849: [ParNew (promotion failed): 1092352K->1098183K(1365376K), 0.0768010 secs]400362.926: [CMS: 1552723K->1552721K(2457600K), 2.2399550 secs] 2645073K->2645069K(3822976
K), [CMS Perm : 110912K->110912K(262144K)], 2.3169970 secs] [Times: user=2.99 sys=0.00, real=2.32 secs] 
400365.167: [GC 400365.167: [ParNew (promotion failed): 1092352K->1099033K(1365376K), 0.0805110 secs] 2645073K->2651756K(3822976K), 0.0807100 secs] [Times: user=0.79 sys=0.00, real=0.08 secs]
 
400365.248: [Full GC 400365.248: [CMS: 1552723K->1552721K(2457600K), 2.2523360 secs] 2651756K->2645070K(3822976K), [CMS Perm : 110912K->110912K(262144K)], 2.2525350 secs] [Times: user=2.24 sy
s=0.01, real=2.25 secs] 
400367.502: [GC 400367.502: [ParNew (promotion failed): 1092352K->1099165K(1365376K), 0.0824150 secs] 2645073K->2651889K(3822976K), 0.0826010 secs] [Times: user=0.79 sys=0.00, real=0.09 secs]
 
400367.584: [Full GC 400367.584: [CMS: 1552723K->1552721K(2457600K), 2.2374030 secs] 2651889K->2645070K(3822976K), [CMS Perm : 110912K->110912K(262144K)], 2.2376010 secs] [Times: user=2.24 sy
s=0.00, real=2.23 secs] 
400369.823: [GC 400369.823: [ParNew (promotion failed): 1092352K->1099280K(1365376K), 0.0785960 secs]400369.902: [CMS: 1552723K->1552721K(2457600K), 2.3003330 secs] 2645073K->2645070K(3822976
K), [CMS Perm : 110913K->110913K(262144K)], 2.3791640 secs] [Times: user=3.06 sys=0.00, real=2.38 secs] 
400372.203: [GC 400372.203: [ParNew (promotion failed): 1092352K->1098365K(1365376K), 0.0761330 secs]400372.280: [CMS: 1552723K->1552721K(2457600K), 2.5404110 secs] 2645073K->2645071K(3822976
K), [CMS Perm : 110913K->110913K(262144K)], 2.6167850 secs] [Times: user=3.28 sys=0.01, real=2.62 secs] 
400374.821: [GC 400374.821: [ParNew (promotion failed): 1092352K->1099070K(1365376K), 0.0780110 secs] 2645073K->2651794K(3822976K), 0.0782120 secs] [Times: user=0.77 sys=0.00, real=0.08 secs]
 
400374.899: [Full GC 400374.899: [CMS: 1552723K->1552721K(2457600K), 2.3030870 secs] 2651794K->2645072K(3822976K), [CMS Perm : 110913K->110912K(262144K)], 2.3032930 secs] [Times: user=2.30 sy
s=0.00, real=2.30 secs] 
400377.204: [GC 400377.204: [ParNew (promotion failed): 1092351K->1099178K(1365376K), 0.0773380 secs]400377.281: [CMS: 1552723K->1552721K(2457600K), 2.3001080 secs] 2645073K->2645072K(3822976
K), [CMS Perm : 110913K->110913K(262144K)], 2.3777080 secs] [Times: user=3.05 sys=0.00, real=2.38 secs] 
400379.582: [GC 400379.582: [ParNew (promotion failed): 1092352K->1099286K(1365376K), 0.0783640 secs] 2645073K->2652010K(3822976K), 0.0785660 secs] [Times: user=0.76 sys=0.00, real=0.08 secs]
 
400379.661: [Full GC 400379.661: [CMS: 1552723K->1552721K(2457600K), 2.5767800 secs] 2652010K->2645073K(3822976K), [CMS Perm : 110913K->110913K(262144K)], 2.5769730 secs] [Times: user=2.58 sy
s=0.00, real=2.58 secs] 
400382.239: [GC 400382.239: [ParNew (promotion failed): 1092352K->1098593K(1365376K), 0.0760230 secs] 2645073K->2651316K(3822976K), 0.0762000 secs] [Times: user=0.74 sys=0.00, real=0.07 secs]
 
400382.315: [Full GC 400382.315: [CMS: 1552723K->1552721K(2457600K), 2.3058620 secs] 2651316K->2645073K(3822976K), [CMS Perm : 110913K->110913K(262144K)], 2.3060490 secs] [Times: user=2.30 sy
s=0.00, real=2.31 secs] 



2、
CMS GC时出现promotion failed和concurrent mode failure
对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;
concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。

这个问题的产生是由于救助空间不够,从而向年老代转移对象,年老代没有足够的空间来容纳这些对象,导致一次full gc的产生。解决这个问题的办法有两种完全相反的倾向:增大救助空间、增大年老代或者去掉救助空间。增大救助空间就是调整-XX:SurvivorRatio参数,这个参数是Eden区和Survivor区的大小比值,默认是32,也就是说Eden区是 Survivor区的32倍大小,要注意Survivo是有两个区的,因此Surivivor其实占整个young genertation的1/34。调小这个参数将增大survivor区,让对象尽量在survitor区呆长一点,减少进入年老代的对象。去掉救助空间的想法是让大部分不能马上回收的数据尽快进入年老代,加快年老代的回收频率,减少年老代暴涨的可能性,这个是通过将-XX:SurvivorRatio 设置成比较大的值(比如65536)来做到。在我们的应用中,将young generation设置成256M,这个值相对来说比较大了,而救助空间设置成默认大小(1/34),从压测情况来看,没有出现prommotion failed的现象,年轻代比较大,从GC日志来看,minor gc的时间也在5-20毫秒内,还可以接受,因此暂不调整。

Concurrent mode failed的产生是由于CMS回收年老代的速度太慢,导致年老代在CMS完成前就被沾满,引起full gc,避免这个现象的产生就是调小-XX:CMSInitiatingOccupancyFraction参数的值,让CMS更早更频繁的触发,降低年老代被沾满的可能。我们的应用暂时负载比较低,在生产环境上年老代的增长非常缓慢,因此暂时设置此参数为80。在压测环境下,这个参数的表现还可以,没有出现过Concurrent mode failed。

3、参考 http://itindex.net/detail/47030-cms-gc-%E9%97%AE%E9%A2%98
啥时候会触发Full GC?

一、旧生代空间不足:java.lang.outOfMemoryError:java heap space;

二、Perm空间满:java.lang.outOfMemoryError:PermGen space;

三、CMS GC时出现promotion failed  和concurrent  mode failure(Concurrent mode failure发生的原因一般是CMS正在进行,但是由于old区内存不足,需要尽快回收old区里面的死的java对象,这个时候foreground gc需要被触发,停止所有的java线程,同时终止CMS,直接进行MSC。);

四、统计得到的minor GC晋升到旧生代的平均大小大于旧生代的剩余空间;

五、主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题;

1、promotion failed的一段日志


2013 - 11 -27T03: 00 : 53.638 + 0800 :  35333.562 : [GC  35333.562 : [ParNew (promotion failed): 1877376K->1877376K(1877376K),  15.7989680  secs] 35349.361 : [CMS: 2144171K->2129287K(2146304K),  10.4200280  sec
s] 3514052K->2129287K(4023680K), [CMS Perm : 119979K->118652K(190132K)],  26.2193500  secs] [Times: user= 30.35  sys= 5.19 , real= 26.22  secs]
解释如下:

1877376K->1877376K(1877376K),  15.7989680  secs   young区
2144171K->2129287K(2146304K),  10.4200280  sec     old区情况
3514052K->2129287K(4023680K)                     heap区情况
119979K->118652K(190132K)],  26.2193500  secs      perm区情况
[Times: user= 30.35  sys= 5.19 , real= 26.22  secs]    整个过程的时间消耗

2、一段正常的CMS的日志

2013 - 11 -27T04: 00 : 12.819 + 0800 :  38892.743 : [GC [ 1  CMS-initial-mark: 1547313K(2146304K)] 1734957K(4023680K),  0.1390860  secs] [Times: user= 0.14  sys= 0.00 , real= 0.14  secs]
2013 - 11 -27T04: 00 : 12.958 + 0800 :  38892.883 : [CMS-concurrent-mark-start]
2013 - 11 -27T04: 00 : 19.231 + 0800 :  38899.155 : [CMS-concurrent-mark:  6.255 / 6.272  secs] [Times: user= 8.49  sys= 1.57 , real= 6.27  secs]
2013 - 11 -27T04: 00 : 19.231 + 0800 :  38899.155 : [CMS-concurrent-preclean-start]
2013 - 11 -27T04: 00 : 19.250 + 0800 :  38899.175 : [CMS-concurrent-preclean:  0.018 / 0.019  secs] [Times: user= 0.02  sys= 0.00 , real= 0.02  secs]
2013 - 11 -27T04: 00 : 19.250 + 0800 :  38899.175 : [CMS-concurrent-abortable-preclean-start]
  CMS: abort preclean due to time  2013 - 11 -27T04: 00 : 25.252 + 0800 :  38905.176 : [CMS-concurrent-abortable-preclean:  5.993 / 6.002  secs] [Times: user= 6.97  sys= 2.16 , real= 6.00  secs]
2013 - 11 -27T04: 00 : 25.253 + 0800 :  38905.177 : [GC[YG occupancy:  573705  K ( 1877376  K)] 38905.177 : [Rescan (parallel) ,  0.3685690  secs] 38905.546 : [weak refs processing,  0.0024100  secs] 38905.548 : [cla
ss unloading,  0.0177600  secs] 38905.566 : [scrub symbol & string tables,  0.0154090  secs] [ 1  CMS-remark: 1547313K(2146304K)] 2121018K(4023680K),  0.4229380  secs] [Times: user= 1.41  sys= 0.01 , real=
0.43  secs]
2013 - 11 -27T04: 00 : 25.676 + 0800 :  38905.601 : [CMS-concurrent-sweep-start]
2013 - 11 -27T04: 00 : 26.436 + 0800 :  38906.360 : [CMS-concurrent-sweep:  0.759 / 0.760  secs] [Times: user= 1.06  sys= 0.48 , real= 0.76  secs]
2013 - 11 -27T04: 00 : 26.436 + 0800 :  38906.360 : [CMS-concurrent-reset-start]
2013 - 11 -27T04: 00 : 26.441 + 0800 :  38906.365 : [CMS-concurrent-reset:  0.005 / 0.005  secs] [Times: user= 0.00  sys= 0.00 , real= 0.00  secs]
这个是一个正常的CMS的日志,共分为七个步骤,重点关注initial-mark和remark这两个阶段,因为这两个是停机的。

A、[GC [1 CMS-initial-mark: 1547313K(2146304K)] 1734957K(4023680K), 0.1390860 secs] [Times: user=0.14 sys=0.00, real=0.14 secs]

各个数据依次表示标记前后old区的所有对象占内存大小和old的capacity,整个JavaHeap(不包括perm)所有对象占内存总的大小和JavaHeap的capacity。

B、2013-11-27T04:00:25.253+0800: 38905.177: [GC[YG occupancy: 573705 K (1877376 K)]38905.177: [Rescan (parallel) , 0.3685690 secs]38905.546: [weak refs processing, 0.0024100 secs]38905.548: [class unloading, 0.0177600 secs]38905.566: [scrub symbol & string tables, 0.0154090 secs] [1 CMS-remark: 1547313K(2146304K)] 2121018K(4023680K), 0.4229380 secs] [Times: user=1.41 sys=0.01, real=0.43 secs]

Rescan (parallel)表示的是多线程处理young区和多线程扫描old+perm的卡表的总时间, parallel 表示多GC线程并行。

weak refs processing 处理old区的弱引用的总时间,用于回收native memory。

class unloading 回收SystemDictionary消耗的总时间。

5、一个特殊的GC日志,根据动态计算直接进行的FullGC(MSC的方式)

1
2013 - 03 -13T13: 48 : 06.349 + 0800 :  7.092 : [GC  7.092 : [ParNew: 471872K->471872K(471872K),  0.0000420  secs] 7.092 : [CMS: 366666K->524287K(524288K),  27.0023450  secs] 838538K->829914K(996160K), [CMS Perm : 3196K->3195K(131072K)],  27.0025170  secs]
ParNew的时间特别短,jvm在minor gc前会首先确认old是不是足够大,如果不够大,这次young gc直接返回,进行MSC。

猜你喜欢

转载自wangqiaowqo.iteye.com/blog/2317494