各位小弟最近在工程中遇到一gc问题,在tomcat中配制的是并发收集,但总会过段时间就出现一次full gc。
    以下是配制
  
JAVA_OPTS="$JAVA_OPTS -d64 -server  -Xmx8g -Xms8g -Xmn3g -XX:PermSize=128m -XX:MaxPermSize=1024m -Xss512k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=1 -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseBiasedLocking -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSParallelReEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+PrintGCDetails -Xloggc:../logs/rifmgt/gc.log"
这是出现full gc前后部分日志
3596.017: [GC 3596.017: [ParNew: 1049595K->1177K(2097152K), 0.0381990 secs] 1236620K->188203K(7340032K), 0.0386920 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 
3597.455: [GC 3597.455: [ParNew: 1049753K->1197K(2097152K), 0.0381020 secs] 1236779K->188222K(7340032K), 0.0386080 secs] [Times: user=0.04 sys=0.00, real=0.04 secs] 
3598.784: [GC 3598.784: [ParNew: 1049763K->1209K(2097152K), 0.0388750 secs] 1236788K->188235K(7340032K), 0.0393930 secs] [Times: user=0.06 sys=0.00, real=0.04 secs] 
3599.944: [GC 3599.945: [ParNew: 1049785K->1579K(2097152K), 0.0392930 secs] 1236811K->188605K(7340032K), 0.0397810 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 
3601.118: [Full GC (System) 3601.118: [CMS: 187025K->113740K(5242880K), 0.8019600 secs] 1129480K->113740K(7340032K), [CMS Perm : 57763K->50540K(131072K)], 0.8024830 secs] [Times: user=0.80 sys=0.00, real=0.80 secs] 
3603.034: [GC 3603.034: [ParNew: 1048576K->3321K(2097152K), 0.0288210 secs] 1162316K->117061K(7340032K), 0.0293470 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] 
3604.046: [GC 3604.046: [ParNew: 1051897K->2217K(2097152K), 0.0280370 secs] 1165637K->115958K(7340032K), 0.0285450 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] 
3605.153: [GC 3605.154: [ParNew: 1050793K->1283K(2097152K), 0.0265540 secs] 1164534K->115023K(7340032K), 0.0270500 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] 
3606.494: [GC 3606.494: [ParNew: 1049859K->1338K(2097152K), 0.0278910 secs] 1163599K->115078K(7340032K), 0.0283100 secs] [Times: user=0.04 sys=0.00, real=0.03 secs] 
361,在jconsole监控过程中,看到Perm 区远远没有满足触发full gc的条件
2,old区设置触发gc的比值 (Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn 算出为60,应该也不会出现空间不够而触发上面配制怎么有误了,要如何设置才能避免老出现full gc (大概1~2钟头出现一次)

解决方案 »

  1.   

    晕啊,没人回答 搞定了。但还是贴出,方便遇到与我一样的朋友。
    http://hllvm.group.iteye.com/group/topic/27945
      

  2.   

    lz怎么解决的呐?加上DisableExplicitGC?
      

  3.   


    这个参数也可以,不可这个参数有一定的危险性,可用下面参数代替
    -XX:+ExplicitGCInvokesConcurrent  jdk1.6
    -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses  jdk1.6 update4后可用(如果可以建议用此参数)这两参数不会禁用System.gc(),而是把full gc用cms代替,在CMS中,并发GC不对old gen做压缩,而full GC是stop-the-world的并且会做压缩