
G1源码分析
OpenJDK 12 G1垃圾回收器源码分析
860MHz
这个作者很懒,什么都没留下…
展开
-
JVM G1 源码分析(一)- 分区Heap Region
1. 简介G1(Garbage-First Collector)是一种垃圾回收算法,最早在JDK 6 Update 14中作为实验性功能加入,并在JDK 7 Update 4正式JDK,之后在JDK 9 中成为默认垃圾回收算法,在JDK 10中优化了Full GC性能。G1是面向服务器的垃圾收集器,针对于多核处理器、大堆的服务器场景。它可以满足短停顿的同时支持高吞吐量。本文及随后几篇文章将分...原创 2019-07-22 14:54:42 · 3119 阅读 · 0 评论 -
JVM G1 源码分析(二)- 对象的堆空间分配
1. 简介当开发者使用JAVA语言实例化一个对象时,排除JIT的标量替换等优化手段,该对象会在JAVA Heap上分配存储空间。分配空间时,为了提高JVM的运行效率,应当尽量减少临界区范围,避免全局锁。G1的通常的应用场景中,会存在大量的Mutator同时执行,为减少锁冲突,引入了TLAB(线程本地分配缓冲区 Thread Local Allocation Buffer)机制。G1支持基于T...原创 2019-07-23 14:15:16 · 2006 阅读 · 1 评论 -
JVM G1 源码分析(三)- Remembered Sets
1. 简介记录集Remembered Sets简称RSet,用于记录对象在不同分区之间的引用关系,目的是为了加速垃圾回收的速度,主要是加速标记阶段。本文将详细介绍RSet的结构。通常的,有两种记录引用关系的方式,PointOut和PointIn。如果obj1.field1=obj2,如果是PointOut方式,则在obj1所在region的RSet记录obj2的位置;如果是PointIn方...原创 2019-07-25 17:26:37 · 3705 阅读 · 0 评论 -
JVM G1 源码分析(四)- Dirty Card Queue Set
1. 简介在上篇文章中,我们介绍了RSet的原理,当对象引用关系变化时,都需要更新RSet。为了不影响Mutator的性能,RSet的更新通常是异步进行的,这一异步更新操作需要引入DCQS(Dirty Card Queue Set)结构。本文将分析DCQS的原理。2. DCQS2.1 写入DCQSJVM声明了一个全局的静态结构G1BarrierSet,其中包含两个Queue Set,Di...原创 2019-07-29 11:44:49 · 2719 阅读 · 0 评论 -
JVM G1 源码分析(五)- 新生代回收YGC
1. 简介G1的YGC仅针对标记为新生代的Region进行回收,因此YGC花费的时间较少。正如之前章节所介绍的,一个Region属于老年代还是新生代时动态的,每次YGC都会回收全部新生代Region,并在之后的内存分配流程中重新分配Region给新生代。2. 代码分析2.1 YGC的流程YGC的流程如下:首先STW,YGC全过程都在STW时进行,不需要考虑并发场景选择CSet(Co...原创 2019-07-30 17:10:15 · 3384 阅读 · 2 评论 -
JVM G1 源码分析(六)- 混合式GC
1. 简介YGC整个过程都在STW下进行,出于减少停顿时间的考量,对于老年代的回收显然需要与Mutator同时进行,G1引入了混合式GC,与CMS算法类似,均采用了并发标记。混合式回收主要分为如下子阶段:初始标记子阶段并发标记子阶段再标记子阶段清理子阶段垃圾回收2. 算法概览2.1 标记算法概览由于混合式GC使用的是并发标记,Mutator可能会随时改变对象引用关系,从而导...原创 2019-08-01 15:18:05 · 1783 阅读 · 1 评论 -
JVM G1 源码分析(七)- Full GC
1. 简介当晋升失败、疏散失败、大对象分配失败、Evac失败时,有可能触发Full GC,在JDK10之前,Full GC是串行的,JEP 307: Parallel Full GC for G1之后引入了并行Full GC。本文主要介绍并行Full GC机制。2. 源码分析Full GC的入口在g1CollectedHeap.cpp的G1CollectedHeap::do_full_col...原创 2019-08-05 16:10:47 · 3089 阅读 · 0 评论