- 浏览: 105794 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (75)
- JVM (22)
- 数据结构 (11)
- java 基础 (16)
- gc (6)
- jmock (1)
- Google (2)
- MapReduce (1)
- Memory (2)
- 算法 (2)
- cglib (1)
- jdk (3)
- 虚拟机 (3)
- 安全 (2)
- 多线程 (1)
- 工作 (1)
- 生活 (1)
- MongoDB (2)
- Hadoop (4)
- HDFS (2)
- cms (2)
- Spring (1)
- 网络协议 (1)
- GitHub (1)
- MYSQL 调优和使用必读(转) (1)
- 分布式 (2)
- Big Data (0)
- 技术Blog (1)
- Hbase (2)
- Zookeeper (1)
- paper (0)
最新评论
-
lzc_java:
Java线程安全兼谈DCL -
select*from爱:
it's nice
IT业薪水大揭秘
首先感谢阿宝
同学的帮助,我才对这个gc算法的调整有了一定的认识,而不是停留在过去仅仅了解的阶段。在读过sun的文档和跟阿宝讨论之后,做个小小的总结,如果有谬误,敬请指正。
CMS,全称Concurrent Low Pause
Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求
大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured
generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少full
gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。在我们的应用中,因为有缓存的存在,并且对于响应时间也有比较高的要求,因此希
望能尝试使用CMS来替代默认的server型JVM使用的并行收集器,以便获得更短的垃圾回收的暂停时间,提高程序的响应性。
CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:
初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) ->
重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep)
->并发重设状态等待下次CMS的触发(CMS-concurrent-reset)
。
其中的1,3两个步骤需要暂停所有的应用程序线程的。第一次暂停从root对象开始标记存活的对象,这个阶段称为初始标记;第二次暂停是在并发标记之后,
暂停所有应用程序线程,重新标记并发标记阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)。第一次暂停会比较短,第二次暂停通常会比较长,并且
remark这个阶段可以并行标记。
而并发标记、并发清除、并发重设阶段的所谓并发,是指一个或者多个垃圾回收线程和应用程序线程并发地运行
,垃圾回收线程不会暂停应用程序的执行,如果你有多于一个处理器,那么并发收集线程将与应用线程在不同的处理器上运行,显然,这样的开销就是会降低应用的吞吐量。Remark阶段的并行
,是指暂停了所有应用程序后,启动一定数目的垃圾回收进程进行并行标记,此时的应用线程是暂停的。
CMS的young generation的回收采用的仍然是并行复制收集器,这个跟Paralle gc算法是一致的。
下面是参数介绍和遇到的问题总结,
1、启用CMS:-XX:+UseConcMarkSweepGC
。 咳咳,这里犯过一个低级错误,竟然将+号写成了-号
2。CMS默认启动的回收线程数目是 (ParallelGCThreads + 3)/4) ,如果你需要明确设定,可以通过-XX: ParallelCMSThreads =20来设定,其中 ParallelGCThreads是年轻代的并行收集线程数
3、CMS是不会整理堆碎片的,因此为了防止堆碎片引起full gc,通过会开启CMS阶段进行合并碎片选项:-XX:+UseCMSCompactAtFullCollection
,开启这个选项一定程度上会影响性能,阿宝的blog里说也许可以通过配置适当的CMSFullGCsBeforeCompaction来调整性能,未实践。
4.为了减少第二次暂停的时间,开启并行remark: -XX:+CMSParallelRemarkEnabled
。如果remark还是过长的话,可以开启-XX:+CMSScavengeBeforeRemark
选项,强制remark之前开始一次minor gc,减少remark的暂停时间,但是在remark之后也将立即开始又一次minor gc。
5.为了避免Perm区满引起的full gc,建议开启CMS回收Perm区选项:
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
6.默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:
-XX:CMSInitiatingOccupancyFraction=80
这里修改成80%沾满的时候才开始CMS回收。
7.年轻代的并行收集线程数默认是(cpu <= 8) ? cpu : 3 + ((cpu * 5) / 8),如果你希望降低这个线程数,可以通过-XX:ParallelGCThreads=
N 来调整。
8.进入重点,在初步设置了一些参数后,例如:
- -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m
- -XX:MaxPermSize=64m -XX:-UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection
- -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled
- -XX:SoftRefLRUPolicyMSPerMB=0
需要在生产环境或者压测环境中测量这些参数下系统的表现,这时候需要打开GC日志查看具体的信息,因此加上参数:
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/test/logs/gc.log
在运行相当长一段时间内查看CMS的表现情况,CMS的日志输出类似这样:
- 4391.322 : [GC [ 1 CMS-initial-mark: 655374K(1310720K)] 662197K(1546688K), 0.0303050 secs] [Times: user= 0.02 sys= 0.02 , real= 0.03 secs]
- 4391.352 : [CMS-concurrent-mark-start]
- 4391.779 : [CMS-concurrent-mark: 0.427 / 0.427 secs] [Times: user= 1.24 sys= 0.31 , real= 0.42 secs]
- 4391.779 : [CMS-concurrent-preclean-start]
- 4391.821 : [CMS-concurrent-preclean: 0.040 / 0.042 secs] [Times: user= 0.13 sys= 0.03 , real= 0.05 secs]
- 4391.821 : [CMS-concurrent-abortable-preclean-start]
- 4392.511 : [CMS-concurrent-abortable-preclean: 0.349 / 0.690 secs] [Times: user= 2.02 sys= 0.51 , real= 0.69 secs]
- 4392.516 : [GC[YG occupancy: 111001 K ( 235968 K)] 4392.516 : [Rescan (parallel) , 0.0309960 secs] 4392.547 : [weak refs processing, 0.0417710 secs] [ 1 CMS-remark: 655734K(1310720K)] 766736K(1546688K), 0.0932010 secs] [Times: user= 0.17 sys= 0.00 , real= 0.09 secs]
- 4392.609 : [CMS-concurrent-sweep-start]
- 4394.310 : [CMS-concurrent-sweep: 1.595 / 1.701 secs] [Times: user= 4.78 sys= 1.05 , real= 1.70 secs]
- 4394.310 : [CMS-concurrent-reset-start]
- 4394.364 : [CMS-concurrent-reset: 0.054 / 0.054 secs] [Times: user= 0.14 sys= 0.06 , real= 0.06 secs]
其中可以看到CMS-initial-mark阶段暂停了0.0303050秒,而CMS-remark阶段暂停了0.0932010秒,因此两次暂停的总共时间是0.123506秒,也就是123毫秒左右。两次短暂停的时间之和在200以下可以称为正常现象。
但是你很可能遇到两种fail引起full gc
:Prommotion failed和Concurrent mode failed。
Prommotion failed的日志输出大概是这样:
- [ParNew (promotion failed): 320138K->320138K(353920K), 0.2365970 secs] 42576.951 : [CMS: 1139969K->1120688K(
- 166784K), 9.2214860 secs] 1458785K->1120688K(2520704K), 9.4584090 secs]
这个问题的产生是由于救助空间不够,从而向年老代转移对象,年老代没有足够的空间来容纳这些对象,导致一次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。
参考资料:
《JDK5.0垃圾收集优化之--Don't Pause
》 by 江南白衣
《记一次Java GC调整经历》1
,2
by Arbow
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
Tuning Garbage Collection
with the 5.0 JavaTM Virtual Machine
发表评论
-
JVM优化之压缩普通对象指针(CompressedOops)
2013-05-03 11:01 1220通常64位JVM消耗的内存 ... -
JVM优化之调整大内存分页(LargePage)
2013-05-03 10:58 1149转载自 ---- http://kenwublog ... -
JVM优化之逃逸分析(Escape Analysis)
2013-05-03 10:56 1036转载自 ---- http://kenwublog ... -
Java基础 之软引用、弱引用、虚引用 ·[转载]
2012-06-07 18:13 11031、概述 在JDK1.2以前的版本中,当一个对象不 ... -
Java中常用的加密方法(JDK)
2012-03-30 16:35 10877转载自 ---- http://www.iteye.co ... -
java的内存管理
2012-03-29 16:59 1559转载自 ---- http://yangzhiyong77 ... -
java虚拟机常用命令工具(转载)
2012-01-31 16:40 6644转载自 ---- http://learnworld.itey ... -
虚拟机中的锁优化简介(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)
2011-10-10 18:07 2127转载自 ---- http://www.iteye.com/t ... -
Java栈与堆
2011-10-10 16:39 825转载自 ---- http://mylir.i ... -
Java内存泄露的理解与解决
2011-10-10 16:38 931转载自 ---- http://henryyang.itey ... -
深入Java,初探JVM
2011-08-23 17:23 788转载自 ---- http://lrysir ... -
深入理解JVM
2011-08-22 18:18 862转载自 ---- http://yanle ... -
CMS gc实践调整(续2)
2011-08-19 12:10 1328转载自 ---- http://www.blogj ... -
CMS gc调整实践(续)
2011-08-19 12:09 1186转载自 ---- http://www.blogjava ... -
JVM问题诊断常用命令:jinfo,jmap,jstack
2011-08-18 11:19 1518转载自 ---- http://singleant.iteye ... -
Java HotSpot 性能引擎架构
2011-08-17 17:04 991转载自 ---- http://lifethink ... -
Java线程安全兼谈DCL
2011-08-17 17:02 1487转载自 ---- http://www.iteye.com/t ... -
用happen-before规则重新审视DCL
2011-08-17 17:00 787转载自 ---- http://lifethink ... -
jvm优化参数整理
2011-08-10 14:47 1383转载自 ---- http://agapple.ite ... -
GC机制小结
2011-08-10 14:07 683转载自 ---- http://zhangjian ...
相关推荐
GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...
cms总结文档,cms总结文档cms总结文档cms总结文档cms总结文档,cms总结文档
《工作手册式CMS建站项目实践》任务书任务4-搭建企业网站开发环境.pdf《工作手册式CMS建站项目实践》任务书任务4-搭建企业网站开发环境.pdf《工作手册式CMS建站项目实践》任务书任务4-搭建企业网站开发环境.pdf...
毕业综合实践报告实例网站CMS开发实践.doc
【现象】悲催的是运行了几天后,突然有几台机器开始报警,上机器看到的现象是CMS GC的remark竟然花了20s+,而实际上这个时候old也就用了2g+,这个时
《工作手册式CMS建站项目实践》任务书任务11-验收企业网站.pdf《工作手册式CMS建站项目实践》任务书任务11-验收企业网站.pdf《工作手册式CMS建站项目实践》任务书任务11-验收企业网站.pdf《工作手册式CMS建站项目...
《工作手册式CMS建站项目实践》任务书任务12-维护企业网站.pdf《工作手册式CMS建站项目实践》任务书任务12-维护企业网站.pdf《工作手册式CMS建站项目实践》任务书任务12-维护企业网站.pdf《工作手册式CMS建站项目...
帝国CMS学生学习知识点总结作文试题练习题考试资讯网站源码 带手机版 帝国CMS《学习》模板,简洁大气访问快,带一个漂亮体验好的手机端,中小学生知识点总结、试题、练习题、考试资讯、作文大全,学习方法技巧等,百度...
《工作手册式CMS建站项目实践》任务书任务2-设计企业网站前台版面.pdf《工作手册式CMS建站项目实践》任务书任务2-设计企业网站前台版面.pdf《工作手册式CMS建站项目实践》任务书任务2-设计企业网站前台版面.pdf...
动易cms动易cms动易cms动易cms动易cms动易cms动易cms动易cms动易cms动易cms动易cms动易cms
用于分析 java gc日志文件。根据日志中的CMS GC统计信息可得到Full GC(也可以理解为Major GC)以及Minor GC相关数据
采用最新html5+css3编写,黑色,大气!
cms源码 cms源码 cms源码 cms源码 cms源码 cms源码 cms源码 cms源码
帝国CMS中小学生学习模板学生知识点总结试题练习题考试资讯网站源码 帝国CMS《学习》模板,简洁大气访问快,带一个漂亮体验好的手机端, 中小学生知识点总结、试题、练习题、考试资讯、作文大全,学习方法技巧等, 百度...
51javacms是一款纯ajax的mvc架构cms;摒弃了传统的ssh的java企业级架构的庞大和臃肿;代码简洁,功能简单实用,安装一键式;站内搜索是使用lucene3.3的技术;真正的开源;真正的免费;非常适合互联网中小型网站的...
苹果cms在线采集70多个接口,用谷歌浏览器用谷歌浏览器
jvm性能调优-垃圾收集器parnew&CMS底层三色标记算-performance-gc-parnew-cms
企业CMS源码,企业CMS源码,企业CMS源码.
基于thinkphp的cms学生学籍管理系统 功能模块:1.管理员模块 管理学生和用户(班主任和年级主任) 2.教师模块 对学生进行增删改 对自己密码修改 操作步骤: 1.首先将数据库相关操作完成 建立数据库连接 数据表的...
aspcms企业网站建设开源程序,对于一些不懂开发的人员来说,是一款不错的软件AspCms2.0.1