`
gao_xianglong
  • 浏览: 467809 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

分享一篇毕玄的《为什么不建议<=3G的情况下使用CMS GC》

    博客分类:
  • JVM
 
阅读更多

为什么不建议<=3G的情况下使用CMS GC

之前曾经有讲过在heap size<=3G的情况下完全不要考虑CMS GC,在heap size>3G的情况下也优先选择ParallelOldGC,而不是CMS GC,只有在暂停时间无法接受的情况下才考虑CMS GC(不过当然,一般来说在heap size>8G后基本上都得选择CMS GC,否则那暂停时间是相当吓人的,除非是完全不在乎响应时间的应用),这其实也是官方的建议(每年JavaOne的GC Tuning基本都会这么讲)。

为什么给了一个这么“武断”的建议呢,不是我对CMS GC有什么不爽,相反CMS GC一直是我很热爱的一种GC实现,之所以建议在<=3G的情况下完全不要考虑CMS GC,主要出于以下几点考虑:

1、触发比率不好设置
在JDK 1.6的版本中CMS GC的触发比率默认为old使用到92%时,假设3G的heap size,那么意味着旧生代大概就在1.5G--2.5G左右的大小,假设是92%触发,那么意味着这个时候旧生代只剩120M--200M的大小,通常这点大小很有可能是会导致不够装下新生代晋生的对象,因此需要调整触发比率,但由于heap size比较小,这个时候到底设置为多少是挺难设置的,例如我看过heap size只有1.5G,old才800m的情况下,还使用CMS GC的,触发比率还是80%,这种情况下就悲催了,意味着旧生代只要使用到640m就触发CMS GC,只要应用里稍微把一些东西cache了就会造成频繁的CMS GC。

CMS GC是一个大部分时间不暂停应用的GC,就造成了需要给CMS GC留出一定的时间(因为大部分时间不暂停应用,这也意味着整个CMS GC过程的完成时间是会比ParallelOldGC时的一次Full GC长的),以便它在进行回收时内存别分配满了,而heap size本来就小的情况下,留多了嘛容易造成频繁的CMS GC,留少了嘛会造成CMS GC还在进行时内存就不够用了,而在不够用的情况下CMS GC会退化为采用Serial Full GC来完成回收动作,这个时候就慢的离谱了。

2、抢占CPU
CMS GC大部分时间和应用是并发的,所以会抢占应用的CPU,通常在CMS GC较频繁的情况下,可以很明显看到一个CPU会消耗的非常厉害。

3、YGC速度变慢
由于CMS GC的实现原理,导致对象从新生代晋升到旧生代时,寻找哪里能放下的这个步骤比ParallelOld GC是慢一些的,因此就导致了YGC速度会有一定程度的下降。

4、碎片问题带来的严重后果
CMS GC最麻烦的问题在于碎片问题,同样是由于实现原理造成的,CMS GC为了确保尽可能少的暂停应用,取消了在回收对象所占的内存空间后Compact的过程,因此就造成了在回收对象后整个old区会形成各种各样的不连续空间,自然也就产生了很多的碎片,碎片会造成什么后果呢,会造成例如明明旧生代还有4G的空余空间,而新生代就算全部是存活的1.5g对象,也还是会出现promotion failed的现象,而在出现这个现象的情况下CMS GC多数会采用Serial Full GC来解决问题。

碎片问题最麻烦的是你完全不知道它什么时候会出现,因此有可能会造成某天高峰期的时候应用突然来了个长暂停,于是就悲催了,对于很多采用了类似心跳来维持长连接或状态的分布式场景而言这都是灾难,这也是Azul的Zing JVM相比而言最大的优势(可实现不暂停的情况下完成Compact,解决碎片问题)。

目前对于这样的现象我们唯一的解决办法都是选择在低峰期主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题,但这显然是一个很龌蹉的办法(因为同样会对心跳或维持状态的分布式场景造成影响)。

5、CMS GC的”不稳定“性
如果关注过我在之前的blog记录的碰到的各种Java问题的文章(可在此查看),就会发现碰到过很多各种CMS GC的诡异问题,尽管里面碰到的大部分BUG目前均已在新版本的JVM修复,但谁也不知道是不是还有问题,毕竟CMS GC的实现是非常复杂的(因为要在尽可能降低应用暂停时间的情况下还保持对象引用的扫描不要出问题),而ParallelOldGC的实现相对是更简单很多的,因此稳定性相对高多了。
而且另外一个不太好的消息是JVM Team的精力都已转向G1GC和其他的一些方面,CMS GC的投入已经很少了(这也正常,毕竟G1GC确实是方向)。

在大内存的情况下,CMS GC绝对是不二的选择,而且Java在面对内存越来越大的情况下,必须采用这种大部分时候不暂停应用的方式,否则Java以后就非常悲催了,G1GC在CMS GC的基础上,有了很多的进步,尤其是会做部分的Compact,但仍然碎片问题还是存在的,哎…

Java现在在大内存的情况下还面临的另外两个大挑战:
1. 分析内存的堆栈太麻烦,例如如果在大内存的情况下出现OOM,那简直就是杯具,想想dump出一个几十G的文件,然后还要分析,这得多长的时间呀,真心希望JDK在这方面能有更好的工具…
2. 对象结构不够紧凑,导致在内存空间有很高要求的场景Java劣势明显,不过这也是新版本JDK会重点优化的地方。
至于在cpu cache miss等控制力度上不如C之类的语言,那是更没办法的,相比带来的开发效率提升,也只能认了,毕竟现在多数场景都是工程性质和大规模人员的场景,因此开发效率、可维护性会更重要很多。

推荐几篇相关的文章:
1. A Generational Mostly-concurrent GC(CMS GC的理论论文)
2. The Pauseless GC Algorithm(可以管窥下Zing是如何实现不暂停compact的)
3. Understanding CMS GC log

最近在纠结一个问题,求有想法或建议的回下消息。
在一个打某种日志的场景中,如何做到避免打日志导致应用受影响,首先异步等是肯定的,但由于日志量巨大,所以仅仅异步还是会造成很大的IO压力,但限流的话到底怎么限比较合理呢?(例如根据IOPS?但IOPS的话还得获取硬件信息等,挺折腾,另外毕竟还是想做到在能支撑的情况下尽可能不要丢弃这些日志信息),有此类场景经验来给点建议吧。

=============================
欢迎关注微信公众号:hellojavacases

关于此微信号:
分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架。

公众号上发布的消息都存放在http://hellojava.info上。

分享到:
评论

相关推荐

    Sun JDK 1.6内存管理--调优篇-毕玄

    《Sun JDK 1.6内存管理—调优篇》由毕玄撰写,旨在深入探讨Java虚拟机(JVM)在Sun JDK 1.6版本下的内存管理与优化策略。本文将详细解读该文中的核心知识点,包括GC调优的基本技巧、编写对GC友好的代码方法,以及...

    Sun_JDK_1.6内存管理--实现篇-毕玄

    它采用了更先进的垃圾收集器,如实时垃圾收集器(Real Time GC),能够在保证低延迟的情况下进行垃圾收集,非常适合对响应时间有严格要求的应用场景。此外,JRockit还提供了更精细的内存管理工具和监控能力,帮助...

    JAVA内存优化-毕玄[归纳].pdf

    JAVA内存优化-毕玄[归纳] 本文将详细介绍 Java 虚拟机(JVM)中的内存优化技术,以提高 Java 应用程序的性能和可靠性。 1. Java 虚拟机运行时的数据区 在 JVM 中,有多个数据区,包括堆(Heap)、栈(Stack)、...

    \"MapReduce研究现状和毕玄-HBase简介与实践分享\"分享总结

    这篇分享总结涵盖了MapReduce的研究现状以及毕玄对于HBase的实践介绍,这两部分的内容对于理解大数据处理的基础设施至关重要。 首先,让我们来深入探讨MapReduce。MapReduce是由Google提出的一种分布式计算模型,它...

    Java中容易踩到的“坑”系列之线程池篇 – hellojavacases - 毕玄 - 林昊1

    同步队列基于数组的有界队列无容量的同步队列有容量的有界队列拒绝执行策略任务入队列策略、线程创建策略– parking to wait for &lt;0x000000

    2017CNUTCon全球容器技术大会【上海站】4/5

    CNUTCon全球运维技术大会是由InfoQ主办的运维&容器技术盛会。大会为期2天,主要面向各行业对运维&容器技术感兴趣的中高端技术人员。秉承着“同步前沿技术、共享实战经验、聚焦最佳实践、激发思想碰撞”的宗旨,...

    JVM堆模型

    《Sun_JDK_1.6内存管理--使用篇-毕玄.pdf》提供了实践指导,帮助我们根据应用特性选择合适的垃圾收集器,调整内存参数,进行性能调优。 总结,JVM堆模型的理解和优化是Java开发者必须掌握的关键技能。通过对堆内存...

    2017阿里技术年度精选01

    一分钱引发的系统设计“踩坑”案例 114 阿里毕玄:智能时代,运维工程师在谈什么? 120 中间件 137 阿里 SRE 体系如何支撑 24 小时峰值压力、220+ 个国家“剁手党”? 137 史上最复杂业务场景,逼出阿里高可用三大法宝 ...

    淘宝技术嘉年华.part2.rar

    3. **毕玄-HBase简介与实践分享.pptx**:毕玄是知名的技术专家,HBase是一款基于Hadoop的分布式NoSQL数据库。他的分享可能包括HBase的基础概念、架构设计、数据模型,以及在实际业务中的应用案例,如大数据存储和...

    2017阿里技术年度精选(上)

    - **实战经验**:分享了具体的演练案例,包括模拟网络中断、服务器宕机等情况下的应急响应措施。 2. **如何高效排查系统故障?一分钱引发的系统设计“踩坑”案例** - **案例分析**:通过一个实际发生的小额支付...

    淘宝技术这十年PDF最终分享版

    目录如下:第一部分 淘宝技术发展引言:光棍节的狂欢个人网站第二部分 淘宝技术发展Java时代创造技术第三部分 淘宝技术发展分布式时代中间件Session框架开放平台第四部分 我在淘宝这八年2004-2012年第五部分 牛P列传...

    逆流而上 阿里巴巴技术成长之路.pdf

    通过大数据技术,阿里巴巴实现了个性化推荐、精准营销,以及对市场趋势的敏锐洞察,为商家和消费者提供了更高效的服务。 3. 云计算布局:阿里云是阿里巴巴集团的重要组成部分,它为企业提供全面的云服务,包括计算...

    JVM内存管理及调优

    毕玄,一位在淘宝有着丰富经验的专家,通过他的演讲PPT,我们能深入理解JVM内存的实现、使用和调优。 ### 一、JVM内存实现 JVM内存主要分为以下几个区域: 1. **程序计数器(Program Counter Register)**:记录...

    《淘宝技术这十年》pdf下载 书籍分享 高清完整版

    《淘宝技术这十年》是由淘宝子柳写的,是一本非常好的关于淘宝、阿里技术的书籍。该书的所有权归子柳所有,同时希望大家购买正版书籍进行学习和阅读。希望对你有所帮助,确实是本好书啊~该书目录如下:第一部分 淘宝...

    藏经阁-AI时代的资源效率.pdf

    阿里巴巴系统软件事业部的负责人毕玄在探讨这一主题时,提到了一系列背景和挑战,以及相应的研究方向。 首先,大数据存储和计算的需求日益增长,这使得拥有大量计算节点(如5000个节点)的企业面临着巨大的资源投入...

Global site tag (gtag.js) - Google Analytics