JVM 垃圾回收器

一、新生代垃圾回收器

  • serial:单线程的新生代垃圾收集器,效率低下,采用复制算法。适用与单CPU的环境下,可以配合CMS使用,但一般不会
  • parnew:采用复制算法,多线程版的serial垃圾收集器,默认配合CMS使用。如果是单CPU效率没有srial高,parNew有线程切换的开销。但是现在的计算机基本是多核的
  • parallel scavenge:采用复制算法。多线程并行垃圾回收器,和parNew区别在于,parNew在于尽可能减少用户垃圾回收时暂停的时间,parallel scavenge在于提供系统的吞吐量(吞吐量=用户代码运行时间/(用户代码运行时间+垃圾回收时间)),适用于交互不多的场景。

二、老年代垃圾回收器

  • serial old:单线程般的垃圾回收器,可以作为CMS预备收集器。使用标记-整理的算法
  • parallel old:多线程并行垃圾收集器,做为parallel scavenge老年代收集器,侧重点在于吞吐量。使用标记-整理的算法
  • CMS:采用标记清除算法,并发标记阶段,不暂停用户线程。响应时间短,用户体验好。

三、cms垃圾回收器回收过程

  • 初始标记:暂停所有线程,标记GC Root直连的对象,停顿时间很短
  • 并发标记:不暂停用户线程,GC线程和用户并发执行,标记GC Root的引用链
  • 重新标记:修改由于并发标记用户线程执行导致引用关系发生变化的那部分标记,会暂停所有线程
  • 并发清除:GC 线程和用户线程并发执行,对垃圾进行清除

四、cms垃圾回收器存在的问题

  • CPU资源敏感,由于并发标记,GC 线程和用户线程并发执行,GC线程暂用一定资源,会导致应用程序变慢
  • 浮动垃圾:由于并发标记阶段,用户线程仍在执行,会产生新的垃圾,而CMS当次无法处理新的垃圾,只能等待下次GC回收,所以需要预留一部分空间来确保程序的运行,当这部分空间不够时会触发Full GC,此时使用serial收集器进行收集。
  • 标记-清除算法,使得cms垃圾回收会产生内存碎片,CMS有个开发参数,默认是开启的,就当要顶不住进行Full GC时,进行内存整理,可以使用参数,在进行几次不压缩的Full GC后进行内存整理,默认是0

五、G1垃圾收集器

G1将内存分为很多大小相同独立的区域。虽然是独立,但是region中可能引用其他region的对象。这样进行可达性分析时,扫描就比较麻烦,所以每个region定义了一个Remembered set记录与其他区域的引用关系,GC扫描时只要扫描Remembered set防止全部扫描。G1的垃圾回收分为以下几部分:

  • 初始标记:标记GC Root直接关联的对象,会暂停用户线程
  • 并发标记:标记GC Root的引用链上的所有对象,不暂停用户线程
  • 最终标记:修正因为并发标记用户线程运行而使引用关系发生变化的那部分标记记录。并发标记会将变化的标记记录在Remembered set logs中,最终标记将Remembered set logs合并到Remembered set 里。需要暂停用户线程
  • 筛选回收:对各个区域回收成本和价值进行排序,根据用户制定的期望时间进行回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值