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

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, 未来的版本中会移除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值