-
v1.12.6.6 Release: v1.12.6.6
# 1.12.6.6 > !这是 1.12.6 的第六个补丁版本 ## 主要更新内容 * 使用新的GC流程,降低STW时间占比,提供更好的性能 ``` 1.12.6.6前,GC的流程大致如下: * GC开始,GC主线程向所有虚拟机发起 GC_INTERRUPT,将所有正在运行的虚拟机挂起 * 确认运行中的虚拟机挂起后,GC主线程发起根标记,GC标记线程将在这个过程中遍历标记虚拟机的栈、寄存器等区域 * 根标记完成后,GC主线程将所有虚拟机唤起; * GC标记线程开始进行并行标记,完成可达性分析 * GC主线程将所有不可达对象回收 * GC结束 1.12.6.6起,GC的流程被更改为 * GC开始,GC主线程向所有虚拟机发起 GC_INTERRUPT,这将让正在运行的虚拟机取得[1]此信号后,将自己标记为 GC_HANGUP_INTERRUPT,开始进行自我标记 * 对于未在运行中的虚拟机,GC主线程将负责标记其 GC_HANGUP_INTERRUPT,并发起GC标记线程,进行标记 * 自我标记的虚拟机在标记结束后,将取消 GC_HANGUP_INTERRUPT 状态,并直接继续运行其他逻辑 * GC主线程等待GC标记标记线程工作结束,尝试唤起由GC标记线程代理标记的虚拟机[2] * 等待自我标记的虚拟机全部处于非 GC_HANGUP_INTERRUPT 的状态(即自我标记结束)。对于部分仍然处于运行状态中,未能及时取得 GC_INTERRUPT 的虚拟机,GC主线程将在此时手动将这些虚拟机清除 GC_INTERRUPT 并标记为 GC_HANGUP_INTERRUPT 并由GC主线程进行代理收集,收集结束后尝试唤起这些虚拟机 * 根收集结束,此时所有虚拟机都恢复正常的运行状态 * GC标记线程开始进行并行标记,完成可达性分析 * GC主线程将所有不可达对象回收 * GC结束 注释: [1] 取得,指获取中断信号并清除这个信号,即便在并发状态下,当信号处于设置状态时,只有一个线程能取得(由原子操作保证) [2] 唤起,对于处于非运行状态的虚拟机,其可能在标记过程中返回运行,这可能破坏标记状态;为了保证标记的顺利进行,在代理标记之前,需要设置 GC_HANGUP_INTERRUPT 以保证虚拟机重新运行时能取得此信号并被直接挂起。而GC线程在工作结束后,则需要尝试取得虚拟机的 GC_HANGUP_INTERRUPT 信号,若无法取得,说明此时虚拟机自身已经被挂起,此时需要进行唤起操作,恢复虚拟机的运行 ```