Phase | Description |
(1)初始标记 (停止世界事件) | 老年代的对象被“标记”为可触及,包括可能从年轻代到达的对象。暂停时间通常相对于次要回收暂停时间短 |
(2)并发标记 | 在Java应用程序线程正在执行的同时遍历可达对象的老年代对象图。从标记的对象开始扫描,并将从根部到达的所有对象进行传递。突发器在并发阶段2,3和5期间执行,并且在这些阶段(包括升级对象)期间在CMS代中分配的任何对象都将立即标记为存活。 |
(3)备注 (停止世界事件) | 查找并发标记阶段遗漏的对象,因为在并发回收器完成跟踪该对象后,Java应用程序线程会更新到对象。 |
(4)并发扫描 | 在标记阶段回收标识为不可达的对象。死对象的集合将对象的空间添加到空闲列表中以供以后分配。此时可能会发生死亡对象的聚结。请注意,活动对象不会移动。 |
(5)复位 | 通过清除数据结构准备下一个并发回收。 |
Phase | Description |
(1)初始标记 (停止世界事件) | 这是停止世界事件。使用G1,它搭载在正常的年轻代GC上。标记幸存区域(根区域),它们可能引用了老年代中的对象。 |
(2)根区域扫描 | 扫描幸存区参考老年代。这在应用程序继续运行时发生。必须在发生年轻代的GC之前完成。 |
(3)并发标记 | 在整个堆中查找活动对象。这在应用程序运行时发生。这个阶段可以被年轻代垃圾回收中断。 |
(4)备注(停止世界事件) | 在堆中完成活动对象的标记。使用一种名为snapshot-at-the-begin(SATB)的算法,该算法比CMS回收器中使用的算法快得多。 |
(5)清理(停止世界事件和并发) | - 执行活动对象和完全自由区域的统计。(停止世界) - 清理记忆集。(停止世界) - 重置空区域并将其返回到空闲列表。(并发) |
(*)复制(停止世界事件) | 这些是停止世界暂停将活动对象撤离或复制到新的未使用区域。这可以用记录为[GC暂停(年轻)]的年轻代区域完成。或者作为[GC暂停(混合)]记录的年轻和老年代区域。 |
在应用程序运行的同时计算活动信息。
这种活动信息确定在撤离暂停期间哪些区域最适合回收。
没有像CMS这样的扫荡阶段。
使用快照开始(SATB)算法,这比CMS使用的快得多。
完全空的区域被回收。
年轻代和老年代同时被回收。
根据活动信息选择老年代。
Option and Default Value | Description |
-XX:+UseG1GC | 使用垃圾回收(G1)回收器 |
-XX:MaxGCPauseMillis=n | 设置最大GC暂停时间的目标。这是一个软目标,JVM将尽力实现。 |
-XX:InitiatingHeapOccupancyPercent=n | 启动并发GC循环的(整个)堆占用的百分比。它被GC使用,基于整个堆的占用而不仅仅是一代(例如,G1)触发并发GC循环。值为0表示“做恒定GC循环”。默认值为45。 |
-XX:NewRatio=n | 年轻代/老年代大小比例。默认值为2。 |
-XX:SurvivorRatio=n | Eden/幸存空间大小的比例。默认值为8。 |
-XX:MaxTenuringThreshold=n | 固定阈值的最大值。默认值为15。 |
-XX:ParallelGCThreads=n | 设置在垃圾回收器的并行阶段使用的线程数。默认值随运行JVM的平台而异。 |
-XX:ConcGCThreads=n | 并发垃圾回收器将使用的线程数。默认值随运行JVM的平台而异。 |
-XX:G1ReservePercent=n | 设置保留为假上限的堆的数量,以减少升级失败的可能性。默认值是10。 |
-XX:G1HeapRegionSize=n | 使用G1,Java堆被细分为均匀大小的区域。这设定了各个部分的大小。此参数的默认值根据堆大小的人体工程学确定。最小值为1Mb,最大值为32Mb。 |
[GC pause (G1 Humongous Allocation) (young) (initial-mark) 24M- >21M(64M), 0.2349730 secs]
[GC pause (G1 Evacuation Pause) (mixed) 66M->21M(236M), 0.1625268 secs] ### (2)-XX:+PrintGCDetails将详细级别设置为更精细。选项显示以下信息: - 每个阶段显示平均,最小和最大时间。 - 根扫描,RSet更新(已处理缓冲区信息),RSet扫描,对象复制,终止(尝试次数)。 - 还显示“其他”时间,例如花费在选择CSet,参考处理,引用排队和释放CSet的时间。 - 显示Eden,幸存区和总堆占用。 ### 示例:
[Ext Root Scanning (ms): Avg: 1.7 Min: 0.0 Max: 3.7 Diff: 3.7]
[Eden: 818M(818M)->0B(714M) Survivors: 0B->104M Heap: 836M(4096M)->409M(4096M)] ### (3)-XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=最好将细节级别设置为最佳。喜欢更细,但包括个人工作者的线程信息。 ### 示例:
[Ext Root Scanning (ms): 2.1 2.4 2.0 0.0
Avg: 1.6 Min: 0.0 Max: 2.4 Diff: 2.3]
[Update RS (ms): 0.4 0.2 0.4 0.0
Avg: 0.2 Min: 0.0 Max: 0.4 Diff: 0.4]
[Processed Buffers : 5 1 10 0
Sum: 16, Avg: 4, Min: 0, Max: 10, Diff: 10]
1.729: [GC pause (young) 46M->35M(1332M), 0.0310029 secs] ### (2)-XX:+PrintGCDateStamps - 为每个条目添加时间前缀。 ### 示例:
2012-05-02T11:16:32.057+0200: [GC pause (young) 46M->35M(1332M), 0.0317225 secs]
414.557: [GC pause (young), 0.03039600 secs] [Parallel Time: 22.9 ms]
[GC Worker Start (ms): 7096.0 7096.0 7096.1 7096.1 706.1 7096.1 7096.1 7096.1 7096.2 7096.2 7096.2 7096.2
Avg: 7096.1, Min: 7096.0, Max: 7096.2, Diff: 0.2] ### Parallel Time – 暂停的主要并行部分的总经过时间 ### Worker Start – worker开始的时间戳 ### 注意:日志在线程ID上排序,并且在每个条目上是一致的
[Ext Root Scanning (ms): 3.1 3.4 3.4 3.0 4.2 2.0 3.6 3.2 3.4 7.7 3.7 4.4
Avg: 3.8, Min: 2.0, Max: 7.7, Diff: 5.7] ### External root scanning - 扫描外部根部所花费的时间(例如,指向堆的系统字典)
[Update RS (ms): 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Avg: 0.0, Min: 0.0, Max: 0.1, Diff: 0.1]
[Processed Buffers : 26 0 0 0 0 0 0 0 0 0 0 0
Sum: 26, Avg: 2, Min: 0, Max: 26, Diff: 26] ### Update Remembered Set - 必须更新在开始暂停之前完成但尚未被并发优化线程处理的任何缓冲区。时间取决于卡的密度。卡越多,需要的时间越长。
[Scan RS (ms): 0.4 0.2 0.1 0.3 0.0 0.0 0.1 0.2 0.0 0.1 0.0 0.0 Avg: 0.1, Min: 0.0, Max: 0.4, Diff: 0.3]F ### Scanning Remembered Sets - 查找指向回收集的指针。
[Object Copy (ms): 16.7 16.7 16.7 16.9 16.0 18.1 16.5 16.8 16.7 12.3 16.4 15.7 Avg: 16.3, Min: 12.3, Max: 18.1, Diff: 5.8] ### Object copy – 每个线程用于复制和疏散对象的时间。
[Termination (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 Avg: 0.0, Min: 0.0, Max: 0.0, Diff: 0.0] [Termination Attempts : 1 1 1 1 1 1 1 1 1 1 1 1 Sum: 12, Avg: 1, Min: 1, Max: 1, Diff: 0] ### Termination time - 当工作线程完成其特定的一组对象进行复制和扫描时,它将进入终止协议。它寻找工作窃取,一旦完成了这项工作,它再次进入终止协议。终止企图计算所有企图窃取工作
[GC Worker End (ms): 7116.4 7116.3 7116.4 7116.3 7116.4 7116.3 7116.4 7116.4 7116.4 7116.4 7116.3 7116.3
Avg: 7116.4, Min: 7116.3, Max: 7116.4, Diff: 0.1]
[GC Worker (ms): 20.4 20.3 20.3 20.2 20.3 20.2 20.2 20.2 20.3 20.2 20.1 20.1
Avg: 20.2, Min: 20.1, Max: 20.4, Diff: 0.3] ### GC worker end time – 单个GC工作停止时的时间戳。 ### GC worker time – 单个GC工作线程花费的时间。
[GC Worker Other (ms): 2.6 2.6 2.7 2.7 2.7 2.7 2.7 2.8 2.8 2.8 2.8 2.8
Avg: 2.7, Min: 2.6, Max: 2.8, Diff: 0.2] ### GC worker other – 不能归因于前面列出的工作阶段的时间(对于每个GC线程)。应该相当低。在过去,我们已经看到了过高的价值,它们被归因于JVM其他部分的瓶颈(例如,代码缓存占用的增加)。
[Clear CT: 0.6 ms] ### 用于清除RSet扫描元数据的卡表的时间
[Other: 6.8 ms] ### GC暂停的各种其他顺序阶段所花费的时间。
[Choose CSet: 0.1 ms] ### 最后确定要回收的区域集合的时间。通常非常小;稍长时必须选择old。
[Ref Proc: 4.4 ms] ### 从GC的前几个阶段延迟处理软、弱等引用的时间。
[Ref Enq: 0.1 ms] ### 在待定列表中放置软、弱等引用的时间。
[Free CSet: 2.0 ms] ### 时间花费了刚刚回收的一些区域,包括他们的记忆集。