如何构建成交型网站,高清效果图网站,网络营销和直播营销的区别,广州多少网络科技有限公司ZGC#xff08;Z Garbage Collector#xff09;是Java平台上的一种垃圾收集器#xff0c;它是由Oracle开发的#xff0c;旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器#xff0c;它主要针对具有大内存需求和低停顿时间要求的应用程序 ZGC的核心概念及…ZGCZ Garbage Collector是Java平台上的一种垃圾收集器它是由Oracle开发的旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器它主要针对具有大内存需求和低停顿时间要求的应用程序 ZGC的核心概念及对应的JVM参数详见 分代ZGC详解 分代ZGC收集器具备以下特性
没有多重映射内存内存屏障优化双重缓冲记忆集无需额外堆内存重分配堆区域密度大对象处理
ZGC 垃圾回收过程 ZGC使用了一种称为并发压缩的技术在垃圾回收过程中进行垃圾对象的压缩和内存整理。下面是ZGC垃圾回收的大致过程
初始标记ZGC会标记出所有的根对象包括线程栈上的引用、静态变量和一些特殊的对象。初始标记的目的是确定一组初始的存活对象以便在后续的并发标记和重定位阶段中进行处理并发标记/对象重定位并发地遍历堆中的对象并标记出这些对象的存活状态。同时ZGC会将存活对象从旧的内存区域重定位到新的内存区域以便为后续的对象分配提供更大的连续空间。这个阶段的并发执行可以减少垃圾回收对应用程序的停顿时间再标记在并发标记阶段期间应用程序可能会继续产生新的对象而这些新对象也需要被标记为存活。因此ZGC需要进行一次再标记阶段以标记并更新在并发标记期间产生的新对象并发转移准备在并发转移准备阶段ZGC会准备进行并发的对象转移。这包括处理与并发标记阶段重叠的一些操作例如更新引用和处理根对象。这个阶段的目的是为并发转移阶段做准备以确保在该阶段的并发执行期间应用程序的执行不会受到过多的停顿。初始转移ZGC会将剩余的存活对象从旧的内存区域转移到新的内存区域。并发转移ZGC会在后台并发地处理剩余的存活对象并将它们从旧的内存区域转移到新的内存区域。与并发标记/对象重定位阶段一样这个阶段的并发执行可以最大程度地减少应用程序的停顿时间
在ZGC的整个垃圾回收过程中大部分工作都是与应用程序线程并发执行的因此ZGC的主要特点是低延迟和高吞吐量适合对响应时间有较高要求的应用场景 ZGC只有三个STW阶段初始标记再标记初始转移。 其中初始标记和初始转移分别都只需要扫描所有GC Roots其处理时间和GC Roots的数量成正比一般情况耗时非常短再标记阶段STW时间很短最多1ms超过1ms则再次进入并发标记阶段。即ZGC几乎所有暂停都只依赖于GC Roots集合大小停顿时间不会随着堆的大小或者活跃对象的大小而增加 ZGC 日志分析
GC(4125) Heap before GC invocations4125 (full 4125):
GC(4125) ZHeap used 1942M, capacity 4536M, max capacity 4536M
GC(4125) Metaspace used 146734K, committed 148096K, reserved 344064K
GC(4125) class space used 17468K, committed 18240K, reserved 212992K
GC(4125) Garbage Collection (Proactive)
GC(4125) Using 1 workers
GC(4125) Pause Mark Start 0.041ms
Safepoint XMarkStart, Time since last: 22124432085 ns, Reaching safepoint: 17382 ns, Cleanup: 6329 ns, At safepoint: 76852 ns, Total: 100563 ns
GC(4125) Concurrent Mark 322.101ms
GC(4125) Pause Mark End 0.022ms
Safepoint XMarkEnd, Time since last: 322171078 ns, Reaching safepoint: 9147 ns, Cleanup: 8722 ns, At safepoint: 52553 ns, Total: 70422 ns
GC(4125) Concurrent Mark Free 0.001ms
GC(4125) Concurrent Process Non-Strong References 41.260ms
GC(4125) Concurrent Reset Relocation Set 0.125ms
Safepoint CleanClassLoaderDataMetaspaces, Time since last: 41168753 ns, Reaching safepoint: 76926 ns, Cleanup: 6011 ns, At safepoint: 3152494 ns, Total: 3235431 ns
GC(4125) Concurrent Select Relocation Set 5.057ms
GC(4125) Pause Relocate Start 0.019ms
Safepoint XRelocateStart, Time since last: 2142288 ns, Reaching safepoint: 16014 ns, Cleanup: 4139 ns, At safepoint: 60372 ns, Total: 80525 ns
GC(4125) Concurrent Relocate 41.819ms
GC(4125) Heap after GC invocations4126 (full 4126):
GC(4125) ZHeap used 242M, capacity 4536M, max capacity 4536M
GC(4125) Metaspace used 146734K, committed 148096K, reserved 344064K
GC(4125) class space used 17468K, committed 18240K, reserved 212992K
GC(4125) Load: 7.70/8.06/8.36
GC(4125) MMU: 2ms/85.9%, 5ms/94.4%, 10ms/97.2%, 20ms/98.6%, 50ms/99.4%, 100ms/99.7%
GC(4125) Mark: 1 stripe(s), 2 proactive flush(es), 1 terminate flush(es), 0 completion(s), 0 continuation(s)
GC(4125) Mark Stack Usage: 32M
GC(4125) NMethods: 11693 registered, 10397 unregistered
GC(4125) Metaspace: 143M used, 144M committed, 336M reserved
GC(4125) Soft: 3566 encountered, 954 discovered, 0 enqueued
GC(4125) Weak: 21037 encountered, 7964 discovered, 6855 enqueued
GC(4125) Final: 45 encountered, 8 discovered, 0 enqueued
GC(4125) Phantom: 757 encountered, 499 discovered, 10 enqueued
GC(4125) Small Pages: 924 / 1848M, Empty: 8M, Relocated: 26M, In-Place: 0
GC(4125) Medium Pages: 2 / 64M, Empty: 32M, Relocated: 0M, In-Place: 0
GC(4125) Large Pages: 5 / 30M, Empty: 0M, Relocated: 0M, In-Place: 0
GC(4125) Forwarding Usage: 10M
GC(4125) Min Capacity: 4536M(100%)
GC(4125) Max Capacity: 4536M(100%)
GC(4125) Soft Max Capacity: 4536M(100%)
GC(4125) Mark Start Mark End Relocate Start Relocate End High Low
GC(4125) Capacity: 4536M (100%) 4536M (100%) 4536M (100%) 4536M (100%) 4536M (100%) 4536M (100%)
GC(4125) Free: 2594M (57%) 2564M (57%) 2600M (57%) 4294M (95%) 4294M (95%) 2560M (56%)
GC(4125) Used: 1942M (43%) 1972M (43%) 1936M (43%) 242M (5%) 1976M (44%) 242M (5%)
GC(4125) Live: - 157M (3%) 157M (3%) 157M (3%) - -
GC(4125) Allocated: - 30M (1%) 34M (1%) 38M (1%) - -
GC(4125) Garbage: - 1784M (39%) 1744M (38%) 45M (1%) - -
GC(4125) Reclaimed: - - 40M (1%) 1738M (38%) - -
GC(4125) Garbage Collection (Proactive) 1942M(43%)-242M(5%)关键点中文解释
GC(4125) HEAP BEFORE GC invocations4125 (FULL 4125): 执行垃圾回收前的引用数GC(4125) Garbage Collection (Proactive): 执行的是一次主动的垃圾回收。GC(4125) USING 1 workers: 使用了1个工作线程。GC(4125) CONCURRENT Mark 322.101ms: 并发标记阶段的耗时GC(4125) CONCURRENT PROCESS Non-Strong REFERENCES 41.260ms: 并发处理非强引用的耗时GC(4125) CONCURRENT RESET Relocation SET 0.125ms: 再标记阶段的耗时GC(4125) CONCURRENT SELECT Relocation SET 5.057ms: 并发选择回收区域的耗时GC(4125) CONCURRENT Relocate 41.819ms: 并发转移阶段的耗时GC(4125) HEAP AFTER GC invocations4126 (FULL 4126): 执行垃圾回收后的引用数
ZGC 垃圾收集统计
Last 10sLast 10mLast 10hTotal单位Avg / MaxAvg / MaxAvg / MaxAvg / MaxCollector: Garbage Collection Cycle411.071 / 411.071426.927 / 571.956395.057 / 615.642396.554 / 794.838msContention: Mark Segment Reset Contention0 / 00 / 00 / 00 / 0ops/sContention: Mark SeqNum Reset Contention0 / 00 / 00 / 00 / 0ops/sCritical: Allocation Stall0 / 00 / 00 / 00 / 0ops/sCritical: Allocation Stall0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000msCritical: GC Locker Stall0 / 00 / 00 / 10 / 1ops/sCritical: GC Locker Stall0.000 / 0.0000.000 / 0.0000.182 / 1.0800.135 / 1.156msCritical: Relocation Stall0 / 00 / 00 / 00 / 0ops/sCritical: Relocation Stall0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000msMemory: Allocation Rate83 / 14074 / 14851 / 21852 / 368MB/sMemory: Defragment0 / 00 / 00 / 00 / 0ops/sMemory: Out Of Memory0 / 00 / 00 / 00 / 0ops/sMemory: Page Cache Flush0 / 00 / 00 / 00 / 0MB/sMemory: Page Cache Hit L141 / 5937 / 6725 / 10926 / 184ops/sMemory: Page Cache Hit L20 / 00 / 00 / 00 / 0ops/sMemory: Page Cache Hit L30 / 00 / 00 / 00 / 63ops/sMemory: Page Cache Miss0 / 00 / 00 / 00 / 1ops/sMemory: Uncommit0 / 00 / 00 / 00 / 0MB/sMemory: Undo Object Allocation Failed6 / 634 / 4471 / 6551 / 1196ops/sMemory: Undo Object Allocation Succeeded21 / 2105 / 4822 / 6052 / 751ops/sMemory: Undo Page Allocation0 / 30 / 30 / 50 / 7ops/sPhase: Concurrent Mark322.101 / 322.101336.304 / 443.879317.178 / 518.134316.142 / 596.839msPhase: Concurrent Mark Continue0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000msPhase: Concurrent Mark Free0.001 / 0.0010.001 / 0.0010.001 / 0.0310.001 / 0.031msPhase: Concurrent Process Non-Strong References41.260 / 41.26039.545 / 74.00236.013 / 74.00237.811 / 128.820msPhase: Concurrent Relocate41.819 / 41.81944.695 / 54.79935.851 / 61.68036.447 / 154.466msPhase: Concurrent Reset Relocation Set0.125 / 0.1250.130 / 0.1820.082 / 0.2870.096 / 0.539msPhase: Concurrent Select Relocation Set5.057 / 5.0575.580 / 6.7145.248 / 9.5775.375 / 96.450msPhase: Pause Mark End0.022 / 0.0220.027 / 0.0610.024 / 0.0770.024 / 0.103msPhase: Pause Mark Start0.041 / 0.0410.035 / 0.0490.036 / 0.2810.035 / 0.281msPhase: Pause Relocate Start0.019 / 0.0190.021 / 0.0300.020 / 0.0760.020 / 0.096msSubphase: Concurrent Classes Purge0.008 / 0.0080.031 / 0.2030.018 / 1.8350.072 / 67.248msSubphase: Concurrent Classes Unlink34.205 / 34.20532.226 / 65.28829.823 / 65.28831.479 / 89.630msSubphase: Concurrent Mark316.043 / 316.043330.668 / 437.551311.415 / 512.480310.233 / 588.118msSubphase: Concurrent Mark Try Flush0.120 / 0.2470.113 / 0.2490.114 / 3.1570.116 / 8.934msSubphase: Concurrent Mark Try Terminate0.028 / 0.0550.029 / 0.0760.031 / 0.4330.031 / 0.657msSubphase: Concurrent References Enqueue0.006 / 0.0060.006 / 0.0100.005 / 0.0450.006 / 0.064msSubphase: Concurrent References Process2.721 / 2.7212.955 / 4.3411.961 / 5.2112.033 / 37.505msSubphase: Concurrent Roots ClassLoaderDataGraph0.697 / 0.6970.626 / 0.7780.619 / 1.5920.635 / 1.764msSubphase: Concurrent Roots CodeCache0.000 / 0.0000.000 / 0.0000.000 / 0.0000.000 / 0.000msSubphase: Concurrent Roots JavaThreads5.053 / 5.0534.708 / 5.1804.889 / 91.0785.013 / 91.078msSubphase: Concurrent Roots OopStorageSet0.162 / 0.1620.138 / 0.1620.141 / 1.0290.144 / 1.029msSubphase: Concurrent Weak Roots OopStorageSet3.957 / 3.9573.962 / 4.5893.840 / 6.3333.849 / 8.860msSubphase: Pause Mark Try Complete0.000 / 0.0000.016 / 0.0160.011 / 0.0260.010 / 0.027msSystem: Java Threads87 / 8787 / 8987 / 9186 / 112thread
G1/ZGC 回收过程对比 G1的混合回收过程可以分为标记阶段、清理阶段和复制阶段。
标记阶段停顿分析 初始标记阶段初始标记阶段是指从GC Roots出发标记全部直接子节点的过程该阶段是STW的。由于GC Roots数量不多通常该阶段耗时非常短。 并发标记阶段并发标记阶段是指从GC Roots开始对堆中对象进行可达性分析找出存活对象。该阶段是并发的即应用线程和GC线程可以同时活动。并发标记耗时相对长很多但因为不是STW所以我们不太关心该阶段耗时的长短。 再标记阶段重新标记那些在并发标记阶段发生变化的对象。该阶段是STW的。 清理阶段停顿分析 清理阶段清点出有存活对象的分区和没有存活对象的分区该阶段不会清理垃圾对象也不会执行存活对象的复制。该阶段是STW的。
复制阶段停顿分析
复制算法中的转移阶段需要分配新内存和复制对象的成员变量。转移阶段是STW的其中内存分配通常耗时非常短但对象成员变量的复制耗时有可能较长这是因为复制耗时与存活对象数量与对象复杂度成正比。对象越复杂复制耗时越长 四个STW过程中初始标记因为只标记GC Roots耗时较短。再标记因为对象数少耗时也较短。清理阶段因为内存分区数量少耗时也较短。转移阶段要处理所有存活的对象耗时会较长。因此G1停顿时间的瓶颈主要是标记-复制中的转移阶段STW ZGC只有三个STW阶段初始标记再标记初始转移。ZGC几乎所有暂停都只依赖于GC Roots集合大小停顿时间不会随着堆的大小或者活跃对象的大小而增加
与ZGC对比G1的转移阶段完全STW的且停顿时间随存活对象的大小增加而增加 参考资料
分代ZGC详解新一代垃圾回收器ZGC的探索与实践分代ZGCG1 垃圾收集器详解