P242 表11-1 不同类型垃圾回收期比较
新生代回收
young、混合回收
(mixed,既收集新生代也收集部分老年代)、FUll GC
。新生代回收
仅仅在开始前需要STW。混合回收
分成两个阶段:并发标记阶段与垃圾回收阶段。并发标记阶段又分四个步骤:初始标记子阶段(initital-mark)、并发标记子阶段(concurrent-mark)、再标记子阶段(remark,STW)、清理子阶段(cleanup,STW)。因分区设计,G1引用关系的存储占用额外空间的消耗较大。G1不是准确收集,会产生浮动垃圾。G1是将内存分成一个个小区域使用。这些区域称之为Heap Region。扩展的有YHR
(新生代分区),OHR
(老生代分区),HHR
(大对象分区)等等
为了达到分配效率与清理效率的平衡,HR的大小有上下限值,即1MB-32MB。结合整个堆空间分为2048个HR,那么通常G1管理的最大的堆是32MB*2048=64G。
涉及的参数有:
如果G1推断出的新生代的最大值与最小值相等,则说明新生代不会动态变化,不会动态变化则可能导致后续新生代GC时不能满足期望的停顿时间,所以有文章提到G1不建议设置Xmn参数。
相关代码在 share/vm/gc_implementation/g1/g1collectorPolicy.cpp
G1有一个线程专门抽样处理预测新生代列表的长度应该多大,并动态调整。
何时扩展以及一次扩展多少内存?
参数-XX:GCTimeRatio 表示GC与应用的耗费时间的比,G1默认是9。也就是说GC的耗时与应用耗时占比超过10%时,进行动态扩展。扩展大小的参数是G1ExpandByPercentOfAvailable,同时至少大于1MB,至多不能超过当前已经分配的大小的一倍。
代码在 size_t G1CollectorPolicy::expansion_amount()....
该书在第五章讲refine线程时对此点有更详细的阐述
比较偏数学 我就很快跳过去了
G1的预测逻辑是基于衰减平均(Decaying Average)和衰减标准差。
卡表(CardTable)是CMS中中常见概念之一。我理解成分区间对象引用关系的描述 的存放处或者说存放的数据结构。此书也是讲的较为简略,细节可以参见《垃圾回收算法手册:自动内存管理的艺术》
讲JVM内存模型必讲对象头。可以参见我写的JVM中对象模型及相应名词概念
栈帧可以参见 封亚飞 写的《揭秘Java虚拟机》第七章 Java栈帧,写的更详细。此书只是一笔带过,看了跟没看没啥差别。
TLAB快速分配的代码在 HeapWord* CollectedHeap::allocate_from_tlab...
先讲Rset
Rset是干什么用的?
我引用了谁
,称为Point Out
;一是谁引用了我
,称为Point In
。G1采用后者。为啥谈到写屏障,因为Refine是线程关注的是应用关系的变更,但是他是如何识别引用关系的变更的呢?就是靠写屏障完成。下面讲写屏障相关要点:
写屏障
是指在改变特定内存的值时,额外执行的一些动作。上面已经讲了,G1 GC分三种: 新生代回收
young、混合回收
(mixed,既收集新生代也收集部分老年代)、FUll GC
步骤:
可以用-XX:G1LogLevel=finest 打开更详细的日志
关键字 GC pause (G1 Evacuation Pause) (young), 0.0182341 secs...
混合回收
分成两个阶段:
并发标记阶段又分四个步骤:
并发标记的难点:
正在标记过程中的对象引用关系发生了改变。
通过三色标记法与STAB算法结合写屏障完成。
写屏障代码在 oop_store中,oop.inline.hpp
关键字 GC pause (G1 Evacuation Pause) (mixed), 0.0106341 secs...
GC pause (G1 Evacuation Pause) (young) (initial-mark),.... // 初始标记借用了YGC
[GC concurrent-mark-start]...
[GC concurrent-mark-end]...
[GC remark ...]...
[GC cleanup ...]...
JDK10之前FGC是串行的,JDK10之后支持并行。
代码在 G1CollectedHeap::do_collection
串行回收采用标记清除算法,步骤:
[Full GC (Allocation Failure) ..... 0.2036229 secs]....
主要涉及的指标有: 吞吐量最大、停段时间尽量端、GC频率尽量低和堆空间的有效利用率高。
主要调优参数 参见P244 表11-2,主要涉及堆、RSet、标记和GC四个方面的参数。
原文:https://www.cnblogs.com/simoncook/p/11831289.html