Concurrent mark sweep GC
很多应用对响应时间的要求要大于吞吐量。
YGC并不暂停多少时间,但FGC对时间的暂用还是很长的。特别是在年老区使用的空间较多时。
因此, HotSpot引入了一个叫做CMS的收集器,也叫低延时收集器。
CMS的YGC
与并行GC同样的方式: stop-the-world 加上 copy。
CMS的FGC
CMS的FGC在大部分是和应用程序一起并发的!
CMS在FGC的时候,一开始需要做一个短暂的暂停,这个阶段称为最初标记:识别所有被引用的对象。
在并发标记时候,会和应用程序一起运行。
因为并发标记是和程序一起运行的,所以在并发标记结束的时候,不能保证所有被引用的对象都被标记,
为了解决这个问题,GC又进行了一次暂停,这个阶段称为:重标识(remark)。
在这个过程中,GC会重新对在并发标阶段时候有修改的对象做标记。
因为remark的暂停要大于最初标记,所以在这时候,需要使用多线程来并行标记。
在上述动作完成之后,就可以保证所有被引用的对象都被标记了。
因此,并发清理阶段就可以并发的收集垃圾了。
下图是serial gc 和 CMS gc 的对比:
因为要增加很多额外的动作,比如对被引用的对象重新标记,增加了CMS的工作量,所以他的GC负荷也相应的增加。
CMS是唯一没有进行压缩的GC。如下图:
没有压缩,对于GC的过程,是节约了时间。但因此产生了内存碎片,所以对于新对象在年老区的分配,就产生了速度上的影响,当然,也就包括了对YGC时间的影响了(因为有可能一些对象晋升到old区中)。
CMS的另一个缺点,就是他需要的堆比较大,因为在并发标记的时候和并发清除的时候,应用程序很有可能在不断产生新的对象,而垃圾又还没有被删除。
另外,在最初标记之后的并发标记时,原先被引用的对象,有可能变成垃圾。但在这一次的GC中,这是没有被删除的。这种垃圾叫做:漂流垃圾。
最后,由于没有进行压缩,由此而带来了内存碎片。
为了解决这个问题,CMS对热点object大小进行了统计,并且估算之后的需求,然后把空闲的内存进行拆分或者合并来满足后续的需求。
与其他的GC不同,CMS并不在年老区满了之后才开始GC,他需要提前进行GC,用以满足在GC同时需要额外的内存。
如果在GC的同时,内存不能满足要求了,则GC就变成了并行GC或者串行GC。
为了防止这种情况,会根据上一次GC的统计来确定启动时间。
或者是当年老区超过初始容量的话,CMS GC就会启动。
初始容量的设置可以在JVM启动时增加参数: -XX:CMSInitiatingOccupancyFraction=n
n是一个百分比,默认值为68。
总之,CMS比并行GC花费了更少的暂停时间,但是牺牲了吞吐量,以及需要更大的堆区。
额外模式
为了防止在并发标记的时候,GC线程长期占用CPU,CMS可以把并发标记的时候停下来,把cpu让给应用程序。
收集器会想并发标记分解成很小的时间串任务,在YGC之间来执行。
这个功能对于机器的CPU个数少,但又想降低暂停时间的应用来说,非常有用。
何时使用CMS
当CPU资源较空闲,并且需要很低的暂停时间时,可以选择CMS。比如 web servers。
选择CMS
选择CMS GC: 增加参数 -XX:UseConcMarkSweepGC
开启额外模式: 增加参数 -XX:+CMSIncreamentalMode
- 大小: 46.5 KB
- 大小: 31.4 KB
分享到:
相关推荐
J2SE5.0_CN.chm API中文手册
j2se5.0中文版api第2部分,因为上传权限有限,给大家带来不便,请见谅
JAVA API帮助文档 中文版 CHM版 J2SE5.0
很好用的J2SE 5.0 API,具有索引的功能!!!
J2SE5.0 API.chm,这个是英文的,等会再上传中文的,两个加在一起太大了 只好分开传了。。。
很好的j2se的API
Java (J2SE 5.0) and C# Comparison Java (J2SE 5.0) and C# Comparison
对J2SE 5.0中的一些新特性进行了精辟的讲解。
对于java开发人员来说 没有一个帮助文档是很郁闷的 尤其对于自学的朋友们,今天得到一个中文版的J2SE5.0的API,不敢独自享用,共享出来给大家,分为2个部分part01和part02
J2SE 5.0- Java安全及网络计算的最新技术
在Eclipse 3.1中体验J2SE 5.0的新特性
真正的j2se api 5.0 中文版帮助,有需要的可以下载.
J2SE专题-正则表达式源代码-非常全面 J2SE专题-正则表达式源代码-非常全面
J2SE6.0 API(冷冬大雪),目前应该说比较好的j2se,api大全,讲的非常详细,翻译准确以及java1.6中文api 和java官方文档api共三套装,三套装,三套装,欢迎下载
提示:本人已将一次性可完整下载版上传,名称为:J2SE 5.0 API (中文版)方便网友下载! 很好用的J2SE 5.0 API,具有索引的功能!!! 下载前请注意:不过由于本人等级太低所以只能分3部分上传,劳烦您下载全部3部分...
提示:本人已将一次性可完整下载版上传,名称为:J2SE 5.0 API (中文版)方便网友下载! 很好用的J2SE 5.0 API,具有索引的功能!!! 下载前请注意:不过由于本人等级太低所以只能分3部分上传,劳烦您下载全部3部分...
提示:本人已将一次性可完整下载版上传,名称为:J2SE 5.0 API (中文版)方便网友下载! 很好用的J2SE 5.0 API,具有索引的功能!!! 下载前请注意:不过由于本人等级太低所以只能分3部分上传,劳烦您下载全部3部分...
Java API帮助文档 J2SE5.0 网页版
2022年J2SE5.0新特性之使用代理服务器Java教程.docx
由韩国出版的J2SE 5.0版的JAVA 2教材源代码