JVM-20-CMS 垃圾收集器 Courrent Mark Sweep(CMS)收集器 / UseConcMarkSweepGC
最常见的 concurrent 收集器
大多数并发收集器同时执行部分工作到应用程序,因此他们的名字。 Java HotSpot VM包括两个主要并发的收集器:
并发标记扫描(CMS)收集器:此收集器适用于喜欢较短垃圾收集暂停且可以与垃圾收集共享处理器资源的应用程序。
垃圾优先(G1)垃圾收集器:此服务器式收集器适用于具有大量内存的多处理器计算机。它以高概率满足垃圾收集暂停时间目标,同时实现高吞吐量。
大多数并发收藏家的开销
大多数并发收集器交换处理器资源(否则可供应用程序使用)以缩短主要收集暂停时间。
最明显的开销是在集合的并发部分期间使用一个或多个处理器。在N处理器系统上,集合的并发部分使用可用处理器的K/N,其中1 `手动调整此值,其中是旧生成大小的整数百分比(0到100)。
暂停计划
年轻一代收藏品和老一代收藏品的停顿独立发生。
它们不重叠,但可以快速连续发生,使得来自一个集合的暂停,紧接着来自另一个集合的一个集合,可以看起来是单个较长的暂停。 为避免这种情况,CMS收集器会尝试在上一次和下一次年轻代暂停之间大致中途安排备注暂停。 目前没有对初始标记暂停进行此调度,这通常比备注暂停短得多。
并发标记扫描收集器测量
以下是CMS收集器的输出,其中包含 -Xlog:gc
选项:
[121,834s][info][gc] GC(657) Pause Initial Mark 191M->191M(485M) (121,831s, 121,834s) 3,433ms
[121,835s][info][gc] GC(657) Concurrent Mark (121,835s)
[121,889s][info][gc] GC(657) Concurrent Mark (121,835s, 121,889s) 54,330ms
[121,889s][info][gc] GC(657) Concurrent Preclean (121,889s)
[121,892s][info][gc] GC(657) Concurrent Preclean (121,889s, 121,892s) 2,781ms
[121,892s][info][gc] GC(657) Concurrent Abortable Preclean (121,892s)
[121,949s][info][gc] GC(658) Pause Young (Allocation Failure) 324M->199M(485M) (121,929s, 121,949s) 19,705ms
[122,068s][info][gc] GC(659) Pause Young (Allocation Failure) 333M->200M(485M) (122,043s, 122,068s) 24,892ms
[122,075s][info][gc] GC(657) Concurrent Abortable Preclean (121,892s, 122,075s) 182,989ms
[122,087s][info][gc] GC(657) Pause Remark 209M->209M(485M) (122,076s, 122,087s) 11,373ms
[122,087s][info][gc] GC(657) Concurrent Sweep (122,087s)
[122,193s][info][gc] GC(660) Pause Young (Allocation Failure) 301M->165M(485M) (122,181s, 122,193s) 12,151ms
[122,254s][info][gc] GC(657) Concurrent Sweep (122,087s, 122,254s) 166,758ms
[122,254s][info][gc] GC(657) Concurrent Reset (122,254s)
[122,255s][info][gc] GC(657) Concurrent Reset (122,254s, 122,255s) 0,952ms
[122,297s][info][gc] GC(661) Pause Young (Allocation Failure) 259M->128M(485M) (122,291s, 122,297s) 5,797ms
注意:
CMS集合(GC ID 657)的输出中散布着次要集合的输出(GC ID 658,659和660);通常,许多次要集合在并发收集周期中发生。暂停初始标记表示并发收集周期的开始。以“Concurrent”开头的行表示并发阶段的开始和结束。暂停备注是最后的暂停。之前未讨论的是预清洁阶段。预清理代表可以同时完成的工作,为备注阶段做准备。最后阶段由并发重置指示,并为下一个并发集合做准备。
初始标记暂停通常相对于次要收集暂停时间较短。并发阶段(并发标记,并发预清除和并发扫描)通常持续时间明显长于次要集合暂停,如CMS收集器输出示例中所示。但请注意,在这些并发阶段期间不会暂停应用程序。注释暂停的长度通常与次要集合相当。备注暂停受某些应用程序特征的影响(例如,高速率的对象修改可以增加此暂停)以及自上次次要集合以来的时间(例如,年轻代中的更多对象可能会增加此暂停)。
参考资料
https://docs.oracle.com/javase/9/gctuning/concurrent-mark-sweep-cms-collector.htm