G1垃圾回收器介绍
G1垃圾回收器在我们设置堆内存大小后,JVM启动在默认情况下把堆内存拆分为大小均等的region具体大小是—堆内存/2048。region大小是2的倍数。
可以通过 “-XX:G1HeapRegionSize” 设置region大小。
region 数量是动态的。初始的时候新生代region只有5%,会随着新生代增加region跟着增加。 垃圾回收后也会减少。默认新生代的占比不会超过60%,可以通过**“- XX:G1MaxNewSizePercent”**设置
新生代
新生代也是有eden区 s1,s2 的区别的他们的数量也是根据region的增加而增加,也是根据一定比例来决定的。“-XX:SurvivorRatio=8”
什么时候进入老年代
- 当年龄到了会进入老年代,年龄设置**“-XX:MaxTenuringThreshold”** 默认15
- 动态年龄规划或某一次发生GC后存货对象大于s区一半。
大对象去哪了
G1 会有专门的region 存放大对象,甚至一个大对象可以放几个region。由于新生代region是逐渐变大,所以大对象是在还没分配新生代的时候,region 就是用来存放大对象的。新生代 老年代GC 都会来回收大对象。
G1垃圾回收的过程
- 初始标记:先STW,然后对各个线程栈内存中的局部变量代表的GC Roots,以及方法区中的类静态变量代表的GC Roots,进行扫描,标记出来他们直接引用的那些对象。
- 并发标记:通过gc roots 追踪全部对象。并且会标记在这期间有哪些对象修改。(比如说哪个对象被新建了,哪个对象失去了引用)
- 最终标记阶段:先STW,但是会根据并发标记 阶段记录的 那些对象修改,最终标记一下有哪些存活对象,有哪些是垃圾对象。
- 混合回收阶段:会STW,这个阶段会计算老年代中每个Region中的存活对象数量,存活对