代码改变世界

JVM之GC回收算法与GC收集器

2019-12-20 11:08  Tony、  阅读(285)  评论(0编辑  收藏  举报

GC回收算法

1.标记清除算法
分为标记阶段和清除阶段
标记阶段:标记处可回收的对象
清除阶段:将已标记的对象所占用的内存回收
缺点:运行多次以后容易产生空间碎片,当需要一整段连续内存时虽然空间足够但是无法分配从而导致多次触发GC操作。适合存活对象多,垃圾对象少的情况

2.复制算法
为了提高标记清除算法的效率,减少内存碎片的产生而出现的,该算法将内存空间分为两个完全相同的两部分,每次只使用其中的一部分。
分为标记阶段、复制阶段和清除阶段
标记阶段:标记不可回收对象
复制阶段:将标记的对象全部复制到另一块未使用的空间中
清除阶段:将已标记对象所在空间全部清除
缺点:虽然解决了空间碎片的问题, 但是内存使用量变为了当前内存的一半,也会涉及到对象地址的改变,适用于存活对象较少的情况

3.标记整理算法
为了解决复制算法只能使用一半内存的情况
分为标记阶段、整理阶段、清除阶段
标记阶段:标记出所有存活对象
整理阶段:将存活对象移到内存的一端
清除阶段:清楚存活对象以外的空间

缺点:虽然解决了空间碎片的问题和浪费空间的问题,但也会涉及到对象地址的改变。

4.分代收集算法
根据对象存活周期的不同将内存划分为新生代区域和老年代区域,在新生代中的对象生存时间短,通常为朝生夕死类型,老年代中的对象通常存活的时间都很长。
根据新生代中对象的类型采用改进的复制算法进行垃圾收集,将新生代分为Eden区和两个大小相等的Servior区,它们的比例默认为8:1,每次只使用Eden区和其中一个Servior区,垃圾收集时将未标记的对象移入到另一个Servior区。
根据老年代对象的类型采用标记整理算法。
此算法是目前HotSpot虚拟机中默认使用的算法。

GC收集器

新生代

1.Serial收集器

是一个单线程的串行收集器,会出现Stop The World,即该收集器运行时会暂停其他所有线程。
适用于客户端模式下的虚拟机

 

 

2.Parallel Scavenge收集器
是Serial收集器的多线程版本,也就是并行收集器 ,也会出现Stop The World,即该收集器运行时会暂停其他所有线程。
适用于Server模式下的虚拟机
默认开启的收集线程数和CPU核数相同

 

 

 

 

3.ParNew收集器
类似于Parallel Scavenge 收集器,可以理解为Parallel Scavenge收集器的加强版,主要就是为了用来配合和CMS一起使用

老年代

1.Serial Old收集器
特性同Serial收集器相同
因为是在老年代,使用的收集算法为标记整理算法

2.Parallel Old收集器
特性同Parallel Scavenge收集器相同,是Parallel Scavenge收集器的老年代版本
使用标记整理算法

3.CMS收集器
分为初始标记、并发标记、重新标记和并发清除阶段
初始标记阶段(STW):此阶段标记GCRoots直接关联的对象,需要停止所有线程
并发标记阶段:同用户线程一起工作,更正标记的对象
重新标记阶段(STW):修正并发标记阶段因用户操作导致的变化,其实就是处理并发标记过程中漏标的对象
并发清除阶段:同用户线程一起工作,清除垃圾


缺点:对资源敏感,无法处理浮动垃圾,执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,特别是在并发标记和并发清理阶段会出现,一边回收,系统一边运行,也许没回收完就再次触发full gc,也就是"concurrent mode failure",此时会进入stop the world,用serial old垃圾收集器来回收

算法:标记清除算法,通过参数-XX:+UseCMSCompactAtFullCollection可以让jvm在执行完标记清除后再做整理,但是内存整理的过程是无法并发整理的会导致STW,空间碎片问题没有了,但是停顿的时间不得不变长,所以虚拟机设计者还提供了另一个参数-XX:CMSFullGCsBeforeCompaction,这个参数用于设置执行多少次FullGC之后再对内存碎片进行整理(默认值是0表示每次Full GC时都进行碎片整理)。


默认开启的线程数为(CPU数量+3)/4

 

   

 

 

4.G1收集器(新生代和老年代通用)
分为初始标记、并发标记、最终标记和筛选回收阶段
初始标记阶段(STW):此阶段标记GCRoots直接关联的对象,需要停止所有线程
并发标记阶段:从GC Roots开始进行可达性分析,与用户线程一起工作
最终标记阶段(STW):修正在并发标记阶段用户操作导致的变化,其实就是处理并发标记过程中漏标的对象
筛选回收阶段(STW):使用多线程的方式清除垃圾,只所以是筛选回收,就是为了实现STW可以在预期的范围内完成垃圾的回收,比如说老年代此时有1000个Region都满了,但事因为根据预期停顿时间,本次垃圾回收可能只能停顿200毫秒,那么通过之前回收成本计算得知,可能回收其中的800个Region刚好需要200ms,那么就只回收800个Region,尽量把GC导致的停顿时间控制在我们指定的范围内,这个阶段其实也可以做到与应用程序一起并发执行,但是因为只能回收一部分Region,时间是用户可控制的,而且停顿用户线程将大

特点:G1收集器将内存分为了多个大小相同的Region,虽然还存在分区的概念,但是已经不是物理上隔离了,它们都是一部分Region的集合
名字的由来:优先回收价值最大的Region

https://mp.weixin.qq.com/s/50oIWe3BE6hegyFwkPxxEA

 

 

 

 

各个收集器的搭配情况

 

 

 注:Hot Spot 虚拟机用的就是 分代收集算法,在新生代中用的是改进的复制算法,主要涉及的收集器(Serial收集器、ParNew收集器、Parallel Scavenge收集器以及G1收集器),在老年代中用的是标记整理算法,主要涉及的收集器(Serial Old收集器、Parallel Old收集器、CMS收集器、G1收集器)。

垃圾回收器使用的模型

  1 除Epsilon ZGC Shenandoah之外的GC都是使用逻辑分代模型

  2 G1是逻辑分代,物理不分代

  3 除此之外不仅逻辑分代,而且物理分代

 

原文地址:https://blog.csdn.net/luffysk/article/details/82730058

 

 

 

https://mp.weixin.qq.com/s/50oIWe3BE6hegyFwkPxxEA