您的位置:首页 > 其它

JVM 内存模型和垃圾回收(四): 并发回收(Concurrent Mark-Sweep Collector)

2017-05-22 14:48 239 查看

JVM 内存模型和垃圾回收(四): 并发回收(Concurrent Mark-Sweep Collector)

这种回收方式是为了解决减少应用暂停时间而出现的。也可以成为
low-latency-collector


CMS是为了减少应用暂停时间设计的,可以与application共享cpu资源。特别是拥有比较大的old generation并且运行在多个cpu系统上的应用。但是,这个回收也适合于追求垃圾回收占用时间比较少的应用。

类似于其他的垃圾回收器,CMS回收器是分代的。young和old都会发生。CMS主要用来降低old generation的收集时间。在每个old generation收集周期内, 首先CMS会停止所有的应用,然后再暂停一次。通常来看,第二次会更长一点。这两个阶段都是多线程实现的。值得注意的是Young generation可能在old generation的收集周期内退出.

Young Generation回收

和并行是一样。

Old Generation回收

首先会短暂的暂停一下。这个过程称为initial-mark,来mark那些从application code直接引用的存活的对象。然后在并发执行mark的时候,应用可以运行。但是也正是因为这个原因,所以存活的对象可能有所改变。所以会在concurrent marking阶段之后,会再次停止应用,进行remark。在remark之后,就确定了哪些真正存活的,哪些是垃圾。这时候就可以运行应用,并且并发地进行sweep操作。

Note:

1. 需要更多的内存. 以空间换时间,在应用运行的时候还是分段进行垃圾回收,这样就需要更多的内存进行分配给应用。

2. 会产生内存碎片。因为CMS没有compact操作,所以只能使用freelist的方式进行内存分配会麻烦一点。

3. 不像其他的垃圾回收,CMS并不会等待old generation变成full的时候再开始。是一个循环的过程。
-XX:CMSInitiatingOccupancyFraction=<N>
可以通过参数来设置开始的阈值。

CMS还有一种模式是incremental Mode

这种模式主要是针对Young的回收进行schedule 回收的时间,将整个回收分为多个短暂的回收从而来降低延迟。但这个在Java 8中已经deprecated, 未来的版本中会移除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: