JVM中的垃圾收集器

1.Serial收集器

Serial收集器是单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集完成

Serial收集器是虚拟机运行在Client模式下的默认新生代垃圾收集器

适用于单CPU,新生代空间较小以及对暂停时间要求不高的应用

2.ParNew收集器

ParNew收集器是Serial收集器的多线程版本,除了使用多线程进行垃圾回收之外,其他行为包括Serial收集器可用的所有控制参数,收集算法,对象分配规则,回收策略等都与Serial收集器完全一样

ParNew收集器是许多运行在Server模式下的虚拟机首选新生代收集器,除了性能高以外,只有它和Serial收集器能与CMS收集器配合工作

3.Parallel Scavenge收集器

Parallel Scavenge的目的是达到一个可控制的吞吐量,所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)高吞吐量可以高效率的利用CPU,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务

Parallel Scavenge收集器提供两个参数用于精确控制吞吐量,分别是控制最大垃圾收起停顿时间的参数:-XX:MaxGCPauseMillis以及直接设置吞吐量大小的参数:-XX:GCTimeRatio

Parallel Scavenge收集器还有一个开关参数:-XX:+UseAdaptiveSizePolicy,当这个参数打开时,就不需要手动指定新生代的大小、Eden与Survivor区的比例、晋升老年代对象年龄等细节参数,只需要把基本的内存数据设置好(如-Xmx设置最大堆),然后使用上边的两个参数给虚拟机设立一个优化目标即可

4.Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,它也是一个单线程的收集器,使用标记-整理算法,进行垃圾回收时,必须暂停其他工作线程

5.Parallel Old收集器 

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法,这个收集器在JDK1.6中才开始提供,通过参数:-XX:+UseParallelOldGC使用Parallel Scavenge+Parallel Old收集器组合进行内存回收

6.CMS收集器

CMS收集器是以获取最短回收停顿时间为目标的收集器,采用的是标记-清除算法,回收完毕后,会产生多个空闲空间,因此使用free-list的方式来记录老年代空间中哪些部分是空闲的,默认开启的回收线程数是(并行GC线程数+3)/4

free-list是一种数据结构,该数据结构用来管理那些回收再利用的内存空间

CMS的过程:

初始标记:

暂停整个应用,然后遍历老年代中所有的GC Root对象和新生代中存活的对象引用到的老年代的对象(指的是新生代中还活着的引用类型对象,引用指向老年代中的对象),使用多线程对这些对象进行标记

并发标记:

恢复所用应用程序,对初始标记中标记的存活对象进行轮循,标记这些对象为可达对象

重新标记:

暂停整个应用,对上一步中修改的对象引用关系或者创建的新对象进行扫描,并重新进行标记

并发收集:

恢复所有应用程序,将没有标记的对象进行回收

CMS收集器优点:并发收集、低停顿

CMS收集器缺点:

1).CMS收集器对CPU资源非常敏感,CPU个数少于4个时,CMS对于用户程序的影响就会变得很大,默认启动的回收线程数是(CPU数量+3)/4,当CPU数量不足4个时,如果CPU负载本来就比较大,还要分出一半的运算能力去执行收集器线程,就可能导致用户程序的执行速度忽然降低,为了应付这种情况,虚拟机提供了一种称为"增量式并发收集器"的CMS收集器变种

2).CMS收集器无法处理浮动垃圾,无法处理在回收时产生的新垃圾,因此会预留一部分空间存放新垃圾,默认老年代空间被占用达到一定百分比时,会触发Full GC

3).产生内存碎片,CMS是基于标记-清除算法的收集器,垃圾回收完后会产生大量的内存碎片,当大对象没有足够的连续空间来分配时,不得不提前触发一次Full GC

7.G1收集器

G1收集器采用并行与并发,利用多CPU,多核缩短整个应用暂停的时间,使用分代收集,整体基于标记-整理算法,局部基于复制算法,不会产生空间碎片

使用G1收集器,Java堆的内存布局是整体规划为多个大小相等的独立区域(Region),虽然还保留新生代核老年代的概念,但是新生代和老年代不再是物理隔离的了,它们都是一部分Region的集合

G1收集器过程大概分为4步:

初始标记

并发标记

最终标记

筛选回收

 

GC的主要回收区域就是年轻代、老年代、持久代,在JDK8以后,持久代消失,被替换成了元空间

串行垃圾回收器:

Serial:用于新生代垃圾收集,采用复制算法

Serial Old:用于老年代垃圾收集,采用标记-整理算法

并行垃圾回收器:

ParNew:用于新生代,采用复制算法

Parallel Scavenge:用于新生代,采用复制算法

Parallel Old:用于老年代,采用标记-整理算法

并发垃圾回收器:

CMS:采用标记-清除算法,用于老年代

垃圾收集器搭配使用情况:

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值