jvm 垃圾收集器(ZGC)


jvm 垃圾收集器(ZGC)

 

官网:https://docs.oracle.com/en/java/javase/15/gctuning/z-garbage-collector.html#GUID-8637B158-4F35-4E2D-8E7B-9DAEF15BB3CD

 

 

*****************************

ZGC 简介

 

The Z Garbage Collector (ZGC) is a scalable low latency garbage collector. 
ZGC performs all expensive work concurrently, without stopping the execution of application 
threads for more than a few milliseconds. 

It is suitable for applications which require low latency. 
Pause times are independent of heap size that is being used. 
ZGC supports heap sizes from 8MB to 16TB.

低延时:所有耗时的工作都是并发执行,用户线程停顿时间很少

停顿时间可控:用户线程停顿时间与回收的堆大小无关

回收空间大:可回收16TB大小的堆空间

 

 

*****************************

ZGC 内存布局

 

将内存划分为多个region(暂时)不设分代;使用整理算法对内存进行回收

      

ZGC的region可以动态的创建和销毁,并且region的大小可以动态变更,主要分三类:

小型region:固定为2M,用于存储小于256KB的小对象;

中型region:固定为4M,用于存储大于等于256KB,小于4M的对象;

大型region:大小可变化,需为2M的整数倍,存储大于等于4M的对象,大型region最小为4M

 

整理算法实现:读屏障、染色指针、内存多重映射

 

 

*****************************

内存多重映射:多个虚拟内存对应同一块物理内存

 

      

concurrent reloate阶段,重分配集(relocation set)中region的存活对象会复制到其他region中

存活对象复制完成后,该region就可重新利用,可将这部分内存空间分配给新的对象

此时,原对象的引用关系可能仍指向该内存地址(concurrent remap阶段会通过转发表修改为真实的内存地址),因此形成虚拟地址与物理地址多对一的关系

 

 

*****************************

染色指针、读屏障

 

      

ZGC的并发整理算法通过染色指针来实现

标记信息存储在引用对象的指针上:高18位不能使用,4位用来存储标记信息,低42位存储对象地址

染色指针不支持32位平台不支持压缩指针(-XX:+UseCompressedOops)最多可使用4TB(2的42次方)的物理内存

 

*********************

标志位说明

 

Marked0 /Marked1:标记位,标记对象是否可用

Remapped:记录对象是否进入过重分配集(对象是否移动过)

Finalizable:标记对象是否只能通过fnalize()访问

 

使用两个标记位Marked0、Marked1:在不同的回收周期交替使用,上一回收周期的标志位在本周期失效,重置为0

如:一个周期中使用Marked0,存活对象标记为01

下一个周期使用标记位Marked1,存活对象标记为10

 

 

*********************

优势

 

region上的存活对象都移走后就可回收region,不用等待引用关系都修改后再释放(引用关系修改通过转发表维护);

染色指针使用读屏障修改引用关系,与使用写屏障相比,大幅减少内存屏障的使用数量;

可以开发未使用的18位记录标记、重定位等信息,将ZGC支持的堆内存由4TB拓展位128TB

 

 

*****************************

ZGC 回收过程

 

      

并发标记:Concurrent Mark

并发标记开始前,停止用户线程,枚举根节点

并发标记期间,用户可以运行,根据根节点进行可达性分析并标记;

并发标记结束后,停止用户线程,做最终标记

 

并发预重分配:Concurrent Prepare for relocate

扫描整个堆,找出需要清理的region,将这些region组成重分配集(relocation set)

java12开始支持的类卸载、弱引用的删除也在这个阶段完成

 

并发重分配:Conurrent relocate

将重分配集中的region存活对象复制到其他region中,使用转发表维护旧对象与新对象的对应关系;

region中的存活对象全部复制完成后,该region的内存空间就可重新使用;

转发表不能释放,需要等到后续阶段对象的引用关系修改完成后才能删除

 

并发重映射:Concurrent Remap

根据转发表,修改指针指向:指向旧对象的内存地址修改为指向新对象的内存地址

这一阶段的工作不一定要立刻完成的,zgc的实现是在下一阶段的Concurrent Mark阶段修改指针的内存地址

 

 

*****************************

相关参数

 

-XX:+UseZGC:使用zgc垃圾收集器(ZGC垃圾收集器在 java 15正式发布)

-XX:ConcGCThreads:垃圾回收线程数,ZGC会根据当前cpu自动设置

 

 

*****************************

示例

 

public class Test8 {

    public static void main(String[] args){
        byte[] b=new byte[10];
        b=null;

        System.gc();
    }
}

 

*********************

虚拟机参数

 

-Xms20m -Xmx20m -Xlog:gc* -XX:+UseZGC

 

*********************

控制台输出

 

[0.032s][info][gc,init] Initializing The Z Garbage Collector
[0.032s][info][gc,init] Version: 14+36-1461 (release)
[0.033s][info][gc,init] NUMA Support: Disabled
[0.033s][info][gc,init] CPUs: 8 total, 8 available
[0.033s][info][gc,init] Memory: 8079M
[0.033s][info][gc,init] Large Page Support: Disabled
[0.033s][info][gc,init] Medium Page Size: N/A
[0.033s][info][gc,init] Workers: 1 parallel, 1 concurrent
[0.034s][info][gc,init] Address Space Type: Contiguous/Unrestricted/Complete
[0.034s][info][gc,init] Address Space Size: 320M x 3 = 960M
[0.034s][info][gc,init] Min Capacity: 20M
[0.034s][info][gc,init] Initial Capacity: 20M
[0.034s][info][gc,init] Max Capacity: 20M
[0.034s][info][gc,init] Max Reserve: 2M
[0.034s][info][gc,init] Pre-touch: Disabled
[0.035s][info][gc,init] Uncommit: Disabled
[0.051s][info][gc,init] Runtime Workers: 1 parallel
[0.051s][info][gc     ] Using The Z Garbage Collector
[0.227s][info][gc,start] GC(0) Garbage Collection (Warmup)
[0.228s][info][gc,phases] GC(0) Pause Mark Start 0.558ms
[0.233s][info][gc,phases] GC(0) Concurrent Mark 5.530ms
[0.234s][info][gc,phases] GC(0) Pause Mark End 0.084ms
[0.234s][info][gc,phases] GC(0) Concurrent Process Non-Strong References 0.589ms
[0.234s][info][gc,phases] GC(0) Concurrent Reset Relocation Set 0.001ms
[0.248s][info][gc,phases] GC(0) Concurrent Select Relocation Set 13.698ms
[0.249s][info][gc,phases] GC(0) Pause Relocate Start 0.425ms
[0.253s][info][gc,phases] GC(0) Concurrent Relocate 3.846ms
[0.253s][info][gc,load  ] GC(0) Load: 0.00/0.00/0.00
[0.253s][info][gc,mmu   ] GC(0) MMU: 2ms/72.1%, 5ms/88.8%, 10ms/93.6%, 20ms/96.8%, 50ms/97.9%, 100ms/98.9%
[0.253s][info][gc,marking] GC(0) Mark: 1 stripe(s), 2 proactive flush(es), 1 terminate flush(es), 1 completion(s), 0 continuation(s) 
[0.253s][info][gc,reloc  ] GC(0) Relocation: Successful, 1M relocated
[0.253s][info][gc,nmethod] GC(0) NMethods: 178 registered, 0 unregistered
[0.253s][info][gc,metaspace] GC(0) Metaspace: 5M used, 5M capacity, 5M committed, 8M reserved
[0.253s][info][gc,ref      ] GC(0) Soft: 36 encountered, 0 discovered, 0 enqueued
[0.253s][info][gc,ref      ] GC(0) Weak: 99 encountered, 92 discovered, 17 enqueued
[0.253s][info][gc,ref      ] GC(0) Final: 0 encountered, 0 discovered, 0 enqueued
[0.253s][info][gc,ref      ] GC(0) Phantom: 14 encountered, 14 discovered, 13 enqueued
[0.253s][info][gc,heap     ] GC(0) Min Capacity: 20M(100%)
[0.253s][info][gc,heap     ] GC(0) Max Capacity: 20M(100%)
[0.253s][info][gc,heap     ] GC(0) Soft Max Capacity: 20M(100%)
[0.253s][info][gc,heap     ] GC(0)                Mark Start          Mark End        Relocate Start      Relocate End           High               Low         
[0.253s][info][gc,heap     ] GC(0)  Capacity:       20M (100%)         20M (100%)         20M (100%)         20M (100%)         20M (100%)         20M (100%)   
[0.253s][info][gc,heap     ] GC(0)   Reserve:        2M (10%)           2M (10%)           2M (10%)           2M (10%)           2M (10%)           2M (10%)    
[0.253s][info][gc,heap     ] GC(0)      Free:       14M (70%)          12M (60%)          12M (60%)          14M (70%)          14M (70%)          10M (50%)    
[0.253s][info][gc,heap     ] GC(0)      Used:        4M (20%)           6M (30%)           6M (30%)           4M (20%)           8M (40%)           4M (20%)    
[0.253s][info][gc,heap     ] GC(0)      Live:         -                 1M (6%)            1M (6%)            1M (6%)             -                  -          
[0.253s][info][gc,heap     ] GC(0) Allocated:         -                 2M (10%)           2M (10%)           4M (20%)            -                  -          
[0.254s][info][gc,heap     ] GC(0)   Garbage:         -                 2M (14%)           2M (14%)           0M (4%)             -                  -          
[0.254s][info][gc,heap     ] GC(0) Reclaimed:         -                  -                 0M (0%)            2M (10%)            -                  -          
[0.254s][info][gc          ] GC(0) Garbage Collection (Warmup) 4M(20%)->4M(20%)
[0.294s][info][gc,start    ] GC(1) Garbage Collection (System.gc())
[0.295s][info][gc,phases   ] GC(1) Pause Mark Start 0.491ms
[0.302s][info][gc,phases   ] GC(1) Concurrent Mark 6.725ms
[0.302s][info][gc,phases   ] GC(1) Pause Mark End 0.036ms
[0.303s][info][gc,phases   ] GC(1) Concurrent Process Non-Strong References 0.723ms
[0.303s][info][gc,phases   ] GC(1) Concurrent Reset Relocation Set 0.003ms
[0.305s][info][gc,phases   ] GC(1) Concurrent Select Relocation Set 2.693ms
[0.306s][info][gc,phases   ] GC(1) Pause Relocate Start 0.347ms
[0.310s][info][gc,phases   ] GC(1) Concurrent Relocate 3.839ms
[0.310s][info][gc,load     ] GC(1) Load: 0.00/0.00/0.00
[0.310s][info][gc,mmu      ] GC(1) MMU: 2ms/72.1%, 5ms/88.8%, 10ms/93.6%, 20ms/95.6%, 50ms/97.9%, 100ms/98.1%
[0.310s][info][gc,marking  ] GC(1) Mark: 1 stripe(s), 2 proactive flush(es), 1 terminate flush(es), 0 completion(s), 0 continuation(s) 
[0.310s][info][gc,reloc    ] GC(1) Relocation: Successful, 1M relocated
[0.310s][info][gc,nmethod  ] GC(1) NMethods: 199 registered, 0 unregistered
[0.310s][info][gc,metaspace] GC(1) Metaspace: 6M used, 6M capacity, 6M committed, 8M reserved
[0.310s][info][gc,ref      ] GC(1) Soft: 40 encountered, 0 discovered, 0 enqueued
[0.310s][info][gc,ref      ] GC(1) Weak: 89 encountered, 78 discovered, 1 enqueued
[0.310s][info][gc,ref      ] GC(1) Final: 0 encountered, 0 discovered, 0 enqueued
[0.310s][info][gc,ref      ] GC(1) Phantom: 5 encountered, 3 discovered, 0 enqueued
[0.310s][info][gc,heap     ] GC(1) Min Capacity: 20M(100%)
[0.310s][info][gc,heap     ] GC(1) Max Capacity: 20M(100%)
[0.310s][info][gc,heap     ] GC(1) Soft Max Capacity: 20M(100%)
[0.310s][info][gc,heap     ] GC(1)                Mark Start          Mark End        Relocate Start      Relocate End           High               Low         
[0.310s][info][gc,heap     ] GC(1)  Capacity:       20M (100%)         20M (100%)         20M (100%)         20M (100%)         20M (100%)         20M (100%)   
[0.310s][info][gc,heap     ] GC(1)   Reserve:        2M (10%)           2M (10%)           2M (10%)           2M (10%)           2M (10%)           2M (10%)    
[0.310s][info][gc,heap     ] GC(1)      Free:       14M (70%)          12M (60%)          12M (60%)          14M (70%)          14M (70%)          10M (50%)    
[0.310s][info][gc,heap     ] GC(1)      Used:        4M (20%)           6M (30%)           6M (30%)           4M (20%)           8M (40%)           4M (20%)    
[0.310s][info][gc,heap     ] GC(1)      Live:         -                 1M (6%)            1M (6%)            1M (6%)             -                  -          
[0.310s][info][gc,heap     ] GC(1) Allocated:         -                 2M (10%)           2M (10%)           4M (20%)            -                  -          
[0.310s][info][gc,heap     ] GC(1)   Garbage:         -                 2M (14%)           2M (14%)           0M (4%)             -                  -          
[0.310s][info][gc,heap     ] GC(1) Reclaimed:         -                  -                 0M (0%)            2M (10%)            -                  -          
[0.310s][info][gc          ] GC(1) Garbage Collection (System.gc()) 4M(20%)->4M(20%)
[0.313s][info][gc,heap,exit] Heap
[0.313s][info][gc,heap,exit]  ZHeap           used 4M, capacity 20M, max capacity 20M
[0.313s][info][gc,heap,exit]  Metaspace       used 6415K, capacity 6463K, committed 6656K, reserved 8192K

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值