JVM参数和jvm.log
参数说明:
-Xms 初始堆大小 -Xmx 最大堆大小 -Xmn 年轻代大小 eden + 2 survivor space -XX:SurvivorRatio=8 Eden区与Survivor区的大小比值 -XX:PermSize 设置持久代(perm gen)初始值 -XX:MaxPermSize 设置持久代最大值 -Xss 每个线程的堆栈大小 -XX:CMSInitiatingOccupancyFraction= 年老代使用空间比达到这个值时开始cms gc -XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间 -XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间 -XX:+PrintHeapAtGC 打印GC前后的详细堆栈信息
测试配置:
-Xms1000m -Xmx1000m -Xmn400m -XX:PermSize=128m -XX:MaxPermSize=128m -Xss512k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/lxx.jvm -XX:CMSInitiatingOccupancyFraction=80
Young GC:
日志:
2015-01-15T16:04:24.237+0800: 1691.665: [GC 1691.665: [ParNew: 350110K->22406K(368640K), 0.0055010 secs] 430492K->105988K(983040K), 0.0055690 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
日志说明:
2015-01-15T16:04:24.237+0800: 1691.665: [ GC 1691.665: [ # (Young GC) 时间戳 ParNew: # ParNew(使用ParNew作为年轻代的垃圾回收期) 350110K->22406K(368640K), # 年轻代 回收前大小->回收后大小(年轻代容量) 0.0055010 secs # 回收时间 ] 430492K->105988K(983040K), # 堆 回收前大小->回收后大小(堆容量) 0.0055690 secs # 回收时间 ] [ Times: user=0.02 sys=0.00, real=0.01 secs # Young GC用户耗时, Young GC系统耗时, Young GC实际耗时 ] 内存容量 年轻代: 368640K(360M) = 400M / (8 + 1 + 1) * (8 + 1) (始终闲置着40M) 堆: 983040K(960M) = 1000M - 40M 内存变化: 年轻代: 368640K(360M) 350110K - 22406K = 327704K 堆: 983040K(960M) 430492K - 105988K = 324504K 327704K - 324504K = 3200K 被移动到了Old Gen
Full GC
日志:
2015-01-15T16:29:53.894+0800: 3221.322: [Full GC 3221.322: [CMS: 614343K->614234K(614400K), 0.4258390 secs] 982961K->973059K(983040K), [CMS Perm : 121449K->121449K(131072K)], 0.4259380 secs] [Times: user=0.43 sys=0.00, real=0.42 secs]
2015-01-15T16:28:49.218+0800: 3156.645: [Full GC (System) 3156.645: [CMS2015-01-15T16:28:49.377+0800: 3156.805: [CMS-concurrent-mark: 0.165/0.166 secs] [Times: user=0.19 sys=0.00, real=0.17 secs]
日志说明:
Full GC (System) # 显式调用System.gc产生的 2015-01-15T16:29:53.894+0800: 3221.322: [ Full GC 3221.322: [ # (Full GC) 时间戳 CMS: 614343K->614234K(614400K), # old区 回收前大小->回收后大小(old区容量) 0.4258390 secs # 回收时间 ] 982961K->973059K(983040K), [ # 堆 回收前大小->回收后大小(堆容量) CMS Perm : 121449K->121449K(131072K) # Perm区 回收前大小->回收后大小(Perm区容量) ], 0.4259380 secs # 回收时间 ] [ Times: user=0.43 sys=0.00, real=0.42 secs ] 内存容量 Old区: 614400K(600M) = 1000M - 400M = 960M - 360M 堆: 983040K(960M) 内存变化: Old区: 614400K(600M) 614343K - 614234K = 109K 堆: 983040K(960M) 982961K - 973059K = 9902K
ParNew (promotion failed)
发生在新生代晋升老年代时,老年代空间不够或连续空间不够却还没达到old区的触发值,引发Full Gc.
2015-01-15T16:26:07.003+0800: 2994.431: [GC 2994.431: [ParNew (promotion failed): 351815K->349784K(368640K), 0.0095780 secs]2994.441: [CMS2015-01-15T16:26:07.074+0800: 2994.502: [CMS-concurrent-mark: 1.043/1.166 secs] [Times: user=4.25 sys=0.03, real=1.16 secs]
concurrent mode failure
发生在CMS GC 运行过程中,老年代空间不足,引发MSC
2015-01-15T16:26:07.003+0800: 2994.431: [GC 2994.431: [ParNew (promotion failed): 351815K->349784K(368640K), 0.0095780 secs]2994.441: [CMS2015-01-15T16:26:07.074+0800: 2994.502: [CMS-concurrent-mark: 1.043/1.166 secs] [Times: user=4.25 sys=0.03, real=1.16 secs]
(concurrent mode failure): 614155K->614338K(614400K), 0.5011370 secs] 960545K->632140K(983040K), [CMS Perm : 121434K->121434K(131072K)], 0.5108440 secs] [Times: user=0.52 sys=0.00, real=0.51 secs]
[参考] http://hot66hot.iteye.com/blog/2075819