一次CMS GC的调优工作

标签: Java 技术 | 发表时间:2013-11-26 20:17 | 作者:Hesey
出处:http://blog.hesey.net

某台机器的内存比较大,之前的JVM参数是4G的堆,在压测过程中发现当QPS上来以后,Full GC会开始抬头,YoungGC的频率就不用说了,比较高。

观察GC日志和jstat -gcutil,感觉是QPS在峰值的时候对象创建比较多,也有大对象产生。于是打算加大堆的大小来延缓GC的时机,并且有一些GC参数的优化,反复调整后找到了一个适合我们的参数(没有一个best的参数,还是得按照应用的的情况去测量,最好是一遍压测一遍调整,最终找到一个best fit的参数组)。

在把堆调大的过程中比较担心下面几个问题:

1、GC的压力会不会增大?

2、一次GC的耗时会不会增加?

3、如果在GC stop-the-world的时间里,rt飙高怎么办?

这些问题最终都得到了解答,参考CMS GC的原理,结合jstat的观察,有了如下的结论。

新生代扩大3倍后,YoungGC每次会从root开始寻找存活的引用,而增大内存其实并不会导致存活对象增多(死亡对象是会增加的),因为只要你的QPS和rt是稳定的,那么同时存在的线程数也是稳定的,一个线程对应一个request,一个request中生成的对象相对是固定的,也就是说,只要QPS和rt稳定,只要内存足够,调的更大,其实正在处理的请求中的对象还是那么多,一次扫描的时间是不会明显增长的,所以往s0和s1拷贝的对象空间也是不会明显增长的,这导致YoungGC的开销和时间,其实并不会像配置的参数那样成倍增长。

而实际上,通过加大新生代的大小,YoungGC的频率明显减小,因为YoungGC是要stop-the-world的,所以应用停机的时间也会缩短。

旧生代的内存增大,可以避免QPS比较高时,内存迅速占满OldGen,触发Full GC。而对于CMS GC而言,因为上面说的新生代live对象不会明显增长,对remark阶段的耗时也是不会增长太多的,而CMS GC的sweep阶段是并发的,通过jstat可以看到Old区的占用百分比是慢慢减少的,sweep的过程对应用的rt影响不明显。

另外加入了-XX:+CMSScavengeBeforeRemark这个参数,用于在remark之前先做一次YoungGC,目的也是为了减少remark的时间,毕竟remark是要stop-the-world的。

相关 [cms gc 工作] 推荐:

一次CMS GC的调优工作

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

CMS gc实践总结

- - 编程语言 - ITeye博客
声明:原文转自http://www.blogjava.net/killme2008/archive/2009/09/22/295931.html,该文所有合法权益归原作者所有,仅在此做技术分享使用. 首先感谢阿宝同学的帮助,我才对这个gc算法的调整有了一定的认识,而不是停留在过去仅仅了解的阶段. 在读过sun的文档和跟阿宝讨论之后,做个小小的总结.

G1,CMS及PARALLEL GC的比较

- - Java译站
这篇文章正好接上前一年我们做的一次现实环境下不同GC算法性能比较的试验. 这次我们仍然进行同样的试验,不过增加了对G1回收器的测试,并且在多个平台进行测试. 今年我们测试的垃圾回收器有如下几个:. 我们使用现成的 JIRA任务来运行这个测试. 选择它的原因非常简单——除去Minecraft(一款著名网游),愤怒的小鸟,以及Eclipse不说, JIRA应该是最著名的Java应用程序了.

一次CMS GC问题排查过程(理解原理+读懂GC日志)

- - ITeye博客
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下. 1、问题的场景和处理过程;2、GC的一些理论东西;3、看懂GC的日志. 问题场景:线上机器在半夜会推送一个700M左右的数据,这个时候有个数据置换的过程,也就是说有700M*2的数据在heap区域中,线上系统超时比较多,导致了很严重(严重程度就不说了)的问题.

Java GC的工作原理详解

- - Java - 编程语言 - ITeye博客
JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制. 首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示. JVM学习笔记 JVM内存管理和JVM垃圾回收.

Java GC 调优

- - Darktea
关于 Java GC 已经有很多好的文档了, 比如这些:. 但是这里还是想再重点整理一下 Java GC 日志的格式, 可以作为实战时的备忘录.. 同时也会再整理一下各种概念. 一, JDK 6 提供的各种垃圾收集器. 先整理一下各种垃圾收集器.. 新生代收集器: Serial, ParNew, Parallel Scavenge (MaxGCPauseMillis vs.

[译]GC专家系列3-GC调优

- - SegmentFault 最新的文章
原文链接: http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collection/. 本篇是”GC专家系列“的第三篇. 在第一篇 理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.

GC 日志分析

- - 码蜂笔记
不同的JVM及其选项会输出不同的日志. 生成下面日志使用的选项: -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:d:/GClogs/tomcat6-gc.log. 最前面的数字 4.231 和 4.445 代表虚拟机启动以来的秒数.

初级分代GC

- - C++博客-首页原创精华区
通常情况下GC分为两种,分别是:扫描GC(Tracing GC)和引用计数GC(Reference counting GC). 其中扫描GC是比较常用的GC实现方法,其原理是:把正在使用的对象找出来,然后把未被使用的对象释放. 而引用计数GC则是对每个对象都添加一个计数器,引用增加一个计数器就加一,引用减少一个计数器就减一,当计数器减至零时,把对象回收释放.

VCMS 发布1.1版——用 web2py 开发的开源 CMS 系统

- Ken - python.cn(jobs, news)
VCMS是用Python Web开发框架web2py开发的开源CMS系统. VCMS于9月21日发布了1.1版本,更新内容包括:文章列表分页、. RSS订阅入口、按考试日期查询考试资讯等. 用web2py开发Web应用是一种享受,欢迎感兴趣的童鞋加入开发:). VCMS是一个简单的用web2py开发的内容管理系统(CMS),适用于个人或中小企业发布资讯.