java 垃圾收集器

1、CMS收集器

CMS Concurren Mark Sweep 收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。

从名字上就可以看出是标记清除算法实现的,他的过程更复杂一些,包括四个步骤,初始标记,并发表弟,重新标记,并发清除,其中初始标记、重新标记这两个步骤任然需要Stop The World。初始标记仅仅只是标记一下GC  Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会比初始标记阶段稍长一点,但远比并发标记的时间短。

由于整个过程中好事最长的并发标记和并发清除过程中,收集器现成都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发的执行。

2、G1收集器

空间整合,G1收集器采用标记整理算法,不会产生内存空间碎片,分配大对象时不会因为无法找到连续空间而提前触发下一次GC.

可预测停顿,这是G1的另一大优点,降低停顿时间是G1和CMS的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒。这几乎已经是实时的垃圾收集器的特征了。

3、内存模型与回收策略

java堆是JVM所管理的内存中最大的一块,堆有时垃圾收集器管理的主要区域,Java堆主要分为2个区域-年轻代和老年代,其中年轻代又分为Eden区和Survivor区,其中Survivor区又分From和To2个区

Eden区 大多数情况下,对象会在新生代Eden区进行分配,当Eden没有足够空间分配时,VM会发出一次MinorGc,MinorGc相比MajorGC更频繁,回收速度也更快。通过Minor GC之后,Eden会被清空,Eden区中绝大部分对象会被回收,而那些无需回收的存活对象,将会进到Survivor的From区,若From区不够,则直接进入Old区。

Survivor区相当于是Eden区和Old区的一个缓冲,类似于我们交通灯中的黄灯。Survivor又分为2个区,一个是From区,一个是TO区。每次执行Minor GC,会将Eden区和From存活的对象放到To区,To区不够则直接放入Old区,Survivor的存在意义就是减少被送到Old区的产生MajorGc的发生,Survivor的筛选保证,只有经历16次Minor GC还能再新生代中存活的对象,才会被送到老年代。

Old区占据着2/3的堆内存空间,只有在Major GC的时候才会进行清理,每次Gc都会触发STW,内存越大,STW的时间越长,所以内存也不仅仅是内存越大越好。由于复制算法在兑现存活率较高的老年代会进行很多次的复制操作,效率很低,所以老年代这里采用的是标记--整理算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值