【Java虚拟机】简单易懂的ZGC原理分析

GC垃圾收集器

GC垃圾收集器的作用就是帮我们清理堆内存里面的垃圾,无需我们自己手动清理,我们只管new对象即可。

就内存自动回收这一点,相比于C和C++来说,是方便了不少。C和C++需要我们自己通过API手动申请内存,用完了需要手动释放,非常麻烦。

在这里插入图片描述

而Java虚拟机则通过GC垃圾收集器的自动内存回收功能,免去了Java程序员手动释放内存的操作,解放出Java程序员的双手。

在这里插入图片描述

有好处,自然也是有代价的。在C和C++的世界里,我们可以自由的控制内存的分配和释放,只要程序设计的好,代码没什么问题,那么就不会有什么OOM的问题。而在Java的世界里,程序员只能new对象,至于对象的回收,以及回收的时机,对于程序员来说都是不可控的,只能由GC来处理。如果程序员new对象的速度太快,GC来不及回收,那么就会OOM(内存溢出)了。

在这里插入图片描述

除了OOM以外,还有STW——stop the world。STW就是当垃圾收集器正在运行的时候,用户线程必须停止,让垃圾收集器先做完垃圾收集的工作,清理完内存中无用的对象,释放出内存空间,用户线程才可以继续运行。这中间用户线程的停止,就是STW,很显然这是会影响程序性能的,需要尽量减少STW的停顿时长。

在这里插入图片描述

因此,GC垃圾收集器也在不断的迭代升级,从Serial单线程垃圾收集器,到Parallel的多线程垃圾收集器,然后就是CMS、G1、ZGC这些可与用户线程并发执行的垃圾收集器,GC的性能不断的优化,STW时间越来越短。

在这里插入图片描述

ZGC的特点

ZGC相对于其他老的垃圾收集器,有许多优点。

首先是ZGC支持大内存垃圾收集,可以支持16TB大小内存的垃圾收集,但是GC停顿时间不会随着内存的增大而增大,也就是大内存、低停顿。

其次,ZGC使用了染色指针技术,搭配上读屏障和转发表,ZGC可以在用户线程继续运行的同时,进行内存整理(标记整理算法),注意是内存整理,这就包括了存活对象转移以及内存回收。这是CMS和G1办不到的,CMS可以与在用户线程并发执行内存回收,那是因为它使用的时标记清除算,不需要整理内存;而G1使用的是标记整理算法,因此内存回收阶段就要STW了。

ZGC还使用了内存多重映射计算,解决染色指针造成对象内存地址错乱的问题。

最后,ZGC还支持NUMA内存分配。

在这里插入图片描述

ZGC相关技术

Region

ZGC采用了基于Region的堆内存布局,堆内存被划分成一小块一小块的内存块,每一个小块就是一个Region。ZGC的Region分为大中小三种类型。

  • 小型Region:容量固定为2MB,用于放置小于256KB的小对象。
  • 中型Region:容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。
  • 大型Region:容量不固定,可以动态变化,但必须为2MB的整数倍,用于放置4MB或以上的大对象,每个大型Region中只会存放一个大对象。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值