技术收藏-开发篇

7种垃圾回收器特点,优劣及使用场景

2019-08-22  本文已影响0人  风吹过那天

7种垃圾回收器特点,优劣及使用场景

一、常见垃圾收集器

==++++常见的垃圾回收器种类++++==

每种垃圾回收器之间不是独立操作的,下图表示垃圾回收器之间有连线表示,可以协作使用。

垃圾回收器

二、新生代垃圾收集器

==1、Serial收集器==

从上图可知当应用程序进行到一个安全的节点的时候,所有的线程全都暂停,等到GC完成后,应用程序线程继续执行。这就像是你一边扫地,旁边要是有人一边嗑瓜子,那你这要一直扫下去的节奏,只能先让他别吃了,然后你才能干活。

==2、ParNew收集器==

如下是ParNew收集器和Serial Old 收集器结合进行垃圾收集的示意图.

ParNew与serialOld

当用户线程都执行到++安全点++时,所有线程暂停执行,采用复制算法进行垃圾收集工作,完成之后,用户线程继续开始执行。

-XX:UseParNewGC #新生代采用ParNew收集器  

==3、Parallel Scavenge收集器==


三、老年代垃圾收集器

1、Serial Old 收集器

2、Parallel Old收集器

-XX:+UserParallelOldGC

3、CMS收集器


四、新生代和老年代垃圾收集器

G1收集器

G1收集器将这个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但两者之间不是物理隔离的。他们都是一部分Region的集合。下图是Java堆的划分示意图。


G1Java堆分区

每一个方块就是一个区域,每个区域可能是 Eden、Survivor、老年代,每种区域的数量也不一定。JVM 启动时会自动设置每个区域的大小(1M ~ 32M,必须是 2 的次幂),最多可以设置 2048 个区域(即支持的最大堆内存为 32M*2048 = 64G),假如设置 -Xmx8g -Xms8g,则每个区域大小为 8g/2048=4M。

G1收集器可以有计划地避免在整个Java堆全区域的垃圾收集。G1可以跟踪各个Region里面垃圾堆积的价值大小(回收所获得的空间大小及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,收集加载最大的region,这种方式保证了有限时间内可以获取尽可能多高的收集效率。

为了在 GC Roots Tracing 的时候避免扫描全堆,在每个 Region 中,都有一个 Remembered Set 来实时记录该区域内的引用类型数据与其他区域数据的引用关系(在前面的几款分代收集中,新生代、老年代中也有一个 Remembered Set 来实时记录与其他区域的引用关系),在标记时直接参考这些引用关系就可以知道这些对象是否应该被清除,而不用扫描全堆的数据。

下图是G收集器运行示意图。从图中可知G1收集器收集器收集过程有初始标记、并发标记、最终标记、筛选回收,和 CMS 收集器前几步的收集过程很相似:


G1垃圾收集

五、常见参数列表

参数 描述
UserSerialGC 采用Serial+ Serial Old的收集器组合进行垃圾回收
UserParNewGC 使用ParNew+Serial Old组合
UseConMarkSweepGC 使用ParNew+CMS+SerialOld组合进行垃圾回收。SerialOld是在Concurrent Mode Failure失败后的后备收集器使用
UseParallelGC 虚拟机运行在Server模式下的默认值。使用Parallel Scavenge +Serial Old的收集器组合进行垃圾回收 (jdk8用的就是这个,但是老年代用的是Parallel Old)
UseParallelOldGC 使用Parallel Scavenge + Parallel Old组合进行垃圾回收
SurvivorRatio 新生代中Eden区与Survior区域的容量比值,默认为8,代表Eden:Survior=8:1
PretenureSizeThreshold 直接晋升到老年代的对象的大小
MaxTenuringThreshold 晋升到老年代对象的年龄,超过这个数值进入老年代
UseAdaptiveSizePolicy 动态调整Java堆中各个区域的大小以及进入老年代的年龄
HandlePromotionFailure 是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的 所有对象存活的极端情况
ParallelGCThreads 并行GC时进行内存回收的线程数
GCTimeRatio GC时间占总时间的比率,默认值99%,即允许1%的GC时间,仅在使用Parallel Scavenge收集器时生效
MaxGCPauseMillis GC的最大停顿时间,仅在使用Parallel Scavenge收集器时生效
CMSInitiatingOccupancyFraction 设置CMS在老年代空间被使用多少后触发垃圾回收,默认是92%,仅在使用CMS收集器时生效
UseCMSCompactAtFullCollection 设置CMS收集器在完成垃圾收集后是否要进行一次内存整理。仅在使用CMS收集器时生效
CMSFullGCsBeforeCompaction 设置CMS收集器进行若干次垃圾收集后再启动一次内存碎片整理。仅在使用CMS时生效
PrintGCDetails 查看程序运行时的GC细节
上一篇下一篇

猜你喜欢

热点阅读