新生代收集器 + 老年代收集器
一、Serial 收集器
串行收集,STW 时间长。
新生代:复制算法
老年代:标记整理算法
JVM_GC-Serial-Operation-Diagram
二、ParNew 收集器
只负责新生代垃圾回收,采用复制算法。
相对于 Serial 收集器,GC 线程由串改并。
JVM_GC-ParNew-SerialOld-Operation-Diagram
三、Parallel Scavenge 收集器
新生代垃圾收集器,采用复制算法。
目标:达到一个可控制的吞吐量。吞吐量优先收集器。
-XX:GCTimeRatio
:设置吞吐量大小。范围:0-100,垃圾收集时间占总时间的比率。
-XX:MaxGCPauseMillis
:控制最大垃圾收集停顿时间。
-XX:+UseAdaptiveSizePolicy
:开关参数,激活后,不需要人工指定新生代大小、Eden和Survivor区的比例、晋升老年代对象大小等细节参数,虚拟机会根据系统运行情况收集性能监控信息,动态调整这些参数以提高最合适的饿停顿时间或者最大的吞吐量。(自适应调节)
四、Parallel Old 收集器
Parallel Scavenge 收集器的老年代版本,支持多线程并发收集,采用标记-整理算法实现。
JVM_GC-Parallel-Scavenge-ParallelOld-Operation-Diagram
五、CMS 收集器
以获取最短回收停顿时间为目标的收集器,采用并发“标记-清除”算法。
整个过程分为四个步骤:
- 初始标记(需要STW)
- 并发标记
- 重新标记(需要STW)
- 并发清除
JVM_GC-CMS-Mark-Sweep-Operation-Diagram
CMS 必须预留一部分空间供并发收集时的程序运行,JDK 6时,当老年代使用了 92% 后,CMS 收集器就会被激活。
如果CMS 运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次“并发失败”,这时会启用后备预案:冻结用户线程的执行,临时启用 Serial Old 收集器来重新进行老年代的垃圾收集。
-XX:CMSInitiatingOccupancyFraction
:设置触发 CMS 的百分比。 -XX:+UseCMSCompactAtFullCollection
:开关参数,控制 CMS 收集器进行 Full GC 时进行内存碎片的合并整理。JDK 9后废弃。
-XX:CMSFullGCsBeforeCompaction
:要求CMS 收集器在执行过若干次不整理空间的 Full GC 之后,下一次进入 Full GC 前会先进行碎片整理。0 表示每次都整理。
优点:并发收集、低停顿。
缺点:
- 对处理器资源非常敏感。
- 无法清除“浮动垃圾”。
- 内存碎片问题。
六、G1 收集器
全年代收集器。支持大内存,保证 GC 低延迟。
JVM_GC-Generational-Partition
Region 中有一类特殊的 Humongous
区域,专门用来存储大对象。G1 认为只要大小超过一个 Region 容量一般的对象即可判定为大对象。
每个 Region 的大小可以通过参数 -XX:G1HeapRegionSize
设定,取值范围为 1MB ~ 32MB,且应为 2 的N次幂。
- 逻辑空间连续,物流空间不一定连续。
堆被分成多个大小的区域,映射为不连续的 eden、Survivor 和 old。 - 可预期的停顿时间。
- 无内存碎片,采用标记-整理算法。
- YGC 一次STW(复制),Mixed GC 四次STW(初始标记、重新标记、清理、复制)
- 停顿时间瓶颈在复制上,未能在转移过程中准确定位对象地址。
-
无法在堆中申请新的分区时,执行 STW 的单线程 Full GC。
JVM_GC-G1-Operation-Diagram
RSet
一种 points-in 结构,在卡表基础上实现,每个 heap 分区(region)一个,用来记录别的 region 指向自己的指针,并标记这些指针在卡表哪些范围内(谁指向我)。
key:引用的 region 地址,value:引用的对象卡页集合。
存活对象用 RSet 标识,GC 时不用扫描整个堆。
YGC
选定 young generation region 的 RSet 作为根集,这些 RSet 记录了 old-young 的跨代引用,避免扫描整个 old generation。
年轻代复制存活对象到新的 Survivor。
Mixed GC
old generation 记录了 old-old 的 RSet,young-old的引用扫描全部由 young generation region 得到,也不用 扫描全部 old generation。
- 并行标记清除不可达 old,复制活跃的 young 和 old。
- 标记清除 old,复制 young 和 old。
region 回收价值
对象存活率、回收预计耗时,回收效果。
网友评论