CMS gc实践调整(续2)

本以为在上篇定稿的参数后应该能有比较好的表现,然后实际的表现大出我的意料,cms回收触发非常频繁,虽然每次都只是10-50毫秒,但是次数12个小时内能达到180多次,这显然不正常。通过gc日志和jstat可以看到,每次old区还在5%左右就开始进行CMS,此时的perm区也才30%,这两个数字有浮动并且CMS触发的时间上也没有规律,在测试环境和生产环境中都是如此。

    那么最后是怎么解决的呢?其实没有解决。我只是替换了一个参数就没再发生这个现象,上文提到为了避免System.gc()调用引起的full gc,使用了jdk6引入的新参数-XX:+ExplicitGCInvokesConcurrent来让System.gc()并发执行,但是测试表明恰恰是这个参数引起了CMS的频繁发生,去掉这个参数就没有那个奇特的现象。重复检查了代码,并且再次查看了GC日志,没有再发现有System.gc()的调用,我暂时将原因归结于使用了ExplicitGCInvokesConcurrent参数后其他方法触发了CMS,如果有知晓的朋友请留言告知,最后的方案还是彻底禁掉了显式GC调用。最终定稿的参数:

-server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m
-XX:PermSize=64m -XX:MaxPermSize=64m -XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0
-XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC
-XX:SurvivorRatio=8

    删除了+CMSPermGenSweepingEnabled,这个参数在jdk6上跟-XX:+CMSClassUnloadingEnabled作用重叠了,如果你还跑在jdk5上面,那么应该使用这个参数。救助空间设置为NewSize的1/10,也就是25M左右,让年轻代尽量回收,防止年轻对象跑到年老代过早触发CMS甚至full gc。CMS的触发阀值下降到70%,因为年老代增长较慢,宁愿回收次数多一点,降低长暂停的可能。

    24小时内的某台生产机器的表现,通过jstat观察:

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 39.70   0.00   5.59  15.15  28.99  20260  326.041    14    0.592  326.633
 39.70   0.00  65.49  15.15  28.99  20260  326.041    14    0.592  326.633
  0.00  36.93  19.37  15.16  29.01  20261  326.059    14    0.592  326.650
  0.00  36.93  93.23  15.16  29.01  20261  326.059    14    0.592  326.650
 34.04   0.00  59.62  15.17  29.01  20262  326.076    14    0.592  326.668
  0.00  38.55  12.76  15.19  29.01  20263  326.094    14    0.592  326.686
  0.00  38.55  65.48  15.19  29.01  20263  326.094    14    0.592  326.686

    CMS两次暂停时间总和在100ms以下,minor gc平均一次执行花了16ms,平均3-4秒发生一次。暂时来看还不错,也许还可以适当调小一下NewSize,加快以下minor gc。

    此次调整总共花了大概一周多的时间,由于经验不足,还是走了不少弯路,幸好最终的结果还可以,也让自己对cms gc有比较深入的了解。我们的系统在周4晚上已经全部更新上线,从内部测试、压测、日常测试、beta测试以来,每个阶段都发现几个隐蔽的问题,在上线后暂时没有再发现问题,证明这个流程还是很有意义的,我过去对流程充满偏见,现在看来是可笑的。总结我在淘宝5个月越来学习到的东西,几个关键词:认真、负责、细心、快乐。

文章转自庄周梦蝶  ,原文发布时间2009-09-26

时间: 2024-11-10 08:10:35

CMS gc实践调整(续2)的相关文章

一次CMS GC的调优工作

某台机器的内存比较大,之前的JVM参数是4G的堆,在压测过程中发现当QPS上来以后,Full GC会开始抬头,YoungGC的频率就不用说了,比较高. 观察GC日志和jstat -gcutil,感觉是QPS在峰值的时候对象创建比较多,也有大对象产生.于是打算加大堆的大小来延缓GC的时机,并且有一些GC参数的优化,反复调整后找到了一个适合我们的参数(没有一个best的参数,还是得按照应用的的情况去测量,最好是一遍压测一遍调整,最终找到一个best fit的参数组). 在把堆调大的过程中比较担心下面

Java CMS GC 361s引发的血案

问题现象 当前项目是基于GemFire集群开发,然而我们偶尔会遇到一个节点掉出集群的情况.在分析问题过程中,我们发现在该节点(N1)掉出去之前发生了如下事件.首先,N1最后的log时间在2015/07/23 06:25:35.544,并且直到2015/07/23 06:31:44.624(6分钟以后)在开始出现下一个log,接收到Primary Locator发出的机群中新的节点视图,处理Primary Locator给他的消息说它"Failed to respond within ack-wa

CMS gc调整实践(续)

  在初步确定CMS参数后,系统运行了几天,今天尝试在线上打开了GC日志,按阿宝同学的说法是gc日志的开销比之jstat还小,打开之后发现确实影响很小.打开GC日志之后又发现几个隐藏的问题比较有价值,这里记录下.    首先是系统在启动的时候有一次System.gc()调用引起的full gc,日志输出类似这样: 1.201: [Full GC (System) 1.201: [CMS: 0K->797K(1310720K), 0.1090540 secs] 29499K->797K(1546

中国电信中高层调整续:多个省公司负责人更换

新浪科技讯 12月2日消息,知情人士透露,除了已披露的福建电信.山东电信618.html">负责人更换外,实际上中国电信旗下还有一些省市公司负责人将更换,包括吉林电信将更换成刘颖. 据悉,上述变动是上周五中国电信召开相关会议中做出决定的,实际上牵涉到两种情况,一种是部分人属于提拔,需要公示,才能任命,时间要求较长,包括中国电信集团市场部http://www.aliyun.com/zixun/aggregation/34599.html">副总经理唐珂升任集团财务部总经理,吉

JVM 基础知识(GC)

几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西.突然发现,基础真的很重要.学习的过程是一个由表及里,再由里及表的过程,所谓的"温故而知新".而真正能走完这个轮回的人,也就能称为大牛或专家了.这个过程可能来来回回,这就是所谓"螺旋上升",而每一次轮回都有新的发现.   这回添加的东西主要集中在基础的一些问题上,还有一些这两年思考的问题.这些问题可能平时我们不会刻意去想,但是真正看清楚了,却发现还是大有裨益的,希望对大家都有帮助~ 一.基础概

了解 CMS 垃圾回收日志

原文地址   作者: poonam 译者:严亮 校对:梁海舰 在CMS GC 时,使用参数-XX:+PrintGCDetails 和 -XX:+PrintGCTimeStamps 会输出很多日志信息,了解这些信息可以帮我们更好的调整参数,以获得更高的性能. 我们来看下在JDK1.4.2_10 中CMS GC日志示例: 39.910: [GC 39.910: [ParNew: 261760K->0K(261952K), 0.2314667 secs] 262017K->26386K(104838

jvm gc相关

1. 杂类 http://www.oracle.com/technetwork/java/faq-140837.html  *    -XX:+UseParallelGC : 和传统的新生代GC一样,只是可以进行并行标记处理. 可通过-XX:ParallelGCThreads指定并发线程数,默认值:-XX:ParallelGCThreads =<#cpus < 8 ? #cpus : 3 + ((5 * #cpus) / 8) > 1.The new parallel garbage c

优酷土豆资深工程师:GC 调优实战

前情概要 对于线上高并发.高吞吐的Java web服务来说,长时间的GC暂停(也叫 stop- the-world)会严重影响系统吞吐.稳定性和用户体验.下文是我们的一个真实线上web系统针对GC调优过程的一个总结.这个系统在调优前,经常会反映有超秒的GC暂停问题,这种GC问题可能会导致调用方(可能是上层服务调用方.负载均衡层或客户端)阻塞.超时.甚至雪崩的情况.我们在系统资源不变的情况下,经过多轮调优,大幅降低了GC的频率和暂停时间. 前期准备 1.统计应用数据(峰值TPS.平均TPS,每秒平

JVM实用参数(七)CMS收集器

原文连接 本文连接  译者: iDestiny  校对:梁海舰 HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器的操作和使用它时可能出现的主要挑战. 就像吞吐量收集器(参见本系列的第6部分),CMS收集器处理老年代的对象,然而其操作要复杂得多.吞吐量收集器总是暂停应用程序线程,并且可能是相当长的一段时间,然而这能够使该算法安全地忽略应用程序.相比