ZGC深度剖析

1.ZGC简介

ZGC是一款jdk11版本支持下的垃圾回收器,支持TB级别的内存,12306抢票软件一般都是TB级别的内存,STW时间不超过1ms,ZGC的出现是为了抢占外部市场,比如安卓,大数据等。

1.1 ZGC内存布局

 ZGC没有分代的概念。一般分为小页面(小于256k的对象分配),中页面(小于4M的对象分配),大页面(大于4M的对象分配)。垃圾回收器回收内存一般先回收小页面对象,中页面和大页面一般不回收。

ZGC支持NUMA模型,UMA是在CPU直接访问总线,NUMA是在CPU和总线之间设置一个本地存储器。访问速度上要比UMA要快。

1.2 ZGC指针着色技术

 ZGC中从jdk11开始支持4T内存,2^42位,也就是0-41位标识堆内存,使用42,43,45来表示GC中的状态信息,其他的44,46-63位预留。

 

1.3 ZGC-GC过程 

1.初始标记(STW)

2.并发标记

3. 再标记(最终标记)(STW)

4. 初始转移(STW)

5. 并发转移

 

1.3.1  ZGC-GC ROOTS 

为了标识垃圾,JVM使用一种GC roots-根可达算法,通过标记Gcroots,找到直接引用对象,并向下查找引用的对象,形成一条引用链。

常见的Gc Roots:虚拟机桟中的本地变量,方法区中的类静态变量,方法区中常量,本地方法桟中JNI指针。

 

 1.3.2 ZGC-垃圾回收算法

ZGC中使用了复制算法和标记整理算法,使用的场景不同,复制算法如果在小页面中旁边有个空白的内存块,就可以使用复制算法进行整理。如果没有多余的内存块,就只能使用标记整理算法。

 

 1.3.3  并发转移算法

通过指针颜色42,43,45位标记颜色,remapped在内存地址发生变化的时候比如new一个新的内存地址或者GC以后内存地址发生变化的时候标记,M0颜色用在初始标记的时候会标记Gc roots直连的对象和引用的对象,M1在第二次GC标记对象的时候会使用,第三次使用M0,第四次使用M1,在初始标记和重新标记的过程中残留的其他颜色的对象就是上一次GC没有回收的对象。

转发表:在内存块中有一小块区域是用来记录旧地址和新地址之间的记录。

 

 1.3.4 STW实战

需要安装jdk11才能跑ZGC,不然会报错

import java.util.LinkedList;
import java.util.List;

/**
 * 使用JDK16测试STW的差异
 * 默认G1: -Xmx2g -XX:+PrintGCDetails
 * ZGC:-XX:+UseZGC -Xmx2g -XX:+PrintGCDetails
 * PS: -XX:+UseParallelGC -Xmx2g -XX:+PrintGCDetails
 */
public class StopWorld {
    /*不停往list中填充数据*/
    //就使用不断的填充 堆 -- 触发GC
    public static class FillListThread extends Thread{
        List<byte[]> list = new LinkedList<>();
        @Override
        public void run() {
            try {
                while(true){
//                    if(list.size()*512/1024/1024>=990){
//                       list.clear();
//                       System.out.println("list is clear");
//                    }
                    byte[] bl;
                    for(int i=0;i<100;i++){
                        bl = new byte[512];
                        list.add(bl);
                    }
                }
            } catch (Exception e) {
            }
        }
    }
    public static void main(String[] args) {
        FillListThread myThread = new FillListThread(); //造成GC,造成STW
        myThread.start();
    }
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingtanghulu_6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值