JVM-04-垃圾回收-03-常见垃圾收集器-01-分代模型

一、常见的垃圾收集器

二、Serial

单线程串行收集垃圾,新生代采用复制算法,老年代采用标记压缩算法,STW

 三、Parallel(吞吐量有限)

(1)多线程并行收集垃圾,新生代采用复制算法,老年代采用标记压缩算法,STW

(2)java8默认,关注高吞吐量、高效利用CPU

 四、CMS(响应时间优先,面试重点)

(1)为了使垃圾收集期间,用户线程还能运行,出现了CMS收集器。CMS是一种以获取最短回收停顿时间为目标的收集器。

(2)在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器,但实际B/S应用中往往都优先采用ParNew+CMS垃圾收集器。

(3)不是有个Parallel 吗? 又出来个ParNew主要是因为Parallel 不能和CMS搭配使用,所以官方又弄出个这么个玩意儿,主要为配合CMS使用。

 4.1 CMS详细说明

 4.1.1、初始标记

对GC Root进行初始标记,会STW。

4.1.2 并发标记

GC线程这个时候就要从GC Roots的直接关联对象开始遍历整个对象图。因这个阶段在垃圾回收期间耗时最长,所以为了避免GC时间过长,这个阶段CMS 让用户线程和 GC线程同时工作,尽量减少用户线程的停顿。 (CMS重点优化了并发标记) 

用户线程和GC线程并行工作,因为用户程序继续运行,所以会产生2个问题:
(1)有新的垃圾产生(漏标、浮动垃圾)----》解决方法:下次GC处理
(2)垃圾对象复活(错标)----》解决办法:见4.1.3 重新标记

4.1.3 重新标记

(1)CMS算法底层实现--三色标记法

JVM把Gcroots可达性分析遍历对象过程中遇到的对象, 按照“是否访问过”这个条件标记成以下三种颜色 : 黑 灰 白

1、黑色: 表示对象已经被垃圾收集器访问过, 且这个对象的所有引用都已经扫描过。 黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。 黑色对象不可能直接(不经过灰色对象) 指向某个白色对象。

2、灰色: 表示对象已经被垃圾收集器访问过, 但这个对象上至少存在一个引用还没有被扫描过。

3、白色: 表示对象尚未被垃圾收集器访问过。 显然在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达。

(2)如何重新标记呢? 这里只要采用 三色标记中的增量更新算法

4.1.4 并发清除

并发清理阶段,主要工作是清理所有的死亡对象,回收被占用的空间。该阶段也会有浮动垃圾产生,浮动垃圾下轮GC清理

4.1.5 并发重置

经过这么一轮的标记,最后的阶段 肯定是把 标记清除掉,等待下一轮 

4.2、CMS注意点

(1)CMS在年老代使用标记-清除算法,会产生碎片:可以通过参数-XX:+UseCMSCompactAtFullCollection让jvm在执行完标记清除后再做整理,从而实现“标记-整理”的效果,减少内存碎片。 还有个参数 -XX:CMSFullGCsBeforeCompaction 代表多少次Full GC以后整理一下内存碎片,默认为0 即每次Full GC之后都会整理内存碎片。

(2)执行过程中的不确定性:在CMS执行期间,如果堆空间不够用又出现Full gc出现concurrent mode failure,这个时候会STW,切换使用Serial Old回收垃圾。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值