分代ZGC的由来与底层原理
本篇文章是记录B站UP译制的分代ZGC的由来与底层原理视频而来,感谢UP!
引子
- 分配失速问题
GC产生的空闲内存远远小于新占用的内存,这样的问题被称为分配失速问题;
解决办法:
- 增加堆大小
- 增加GC线程数量
ZGC的基本知识
- 内存划分
JVm中大多数对象都是朝生夕灭的状态,不会长久存在,因此在最早的时候就根据这两种状态将堆划分为年轻代和老年代,在对新对象分配空间后,这个内存地址一开始是被分配到年轻代中,过了一段时间或者是满足一些条件之后就就会晋升到老年代中;
ZGC中堆内存的划分也按照这种方式来进行,不同的是ZGC中对于年轻代和老年代的划分在内存上不是连续的,如下所示
这种设计有助于处理内存中分配大对象,不用重复移动对象;
- 处理阶段
- 并发标记阶段
主要是用于标记当前堆中存活的对象
- 并行重定位阶段
主要是
GC类型
- Minor Collection
Minor只处理年轻代中的垃圾
标记不可达对象是通过两种方法:GC Roots和老年代记忆集,记忆集指的是老年代中指向年轻代指针的位置;
ZGC中对于空闲内存是所有的对象都可以进行使用,不会先划分老年代和年轻代再在相应的内存中获取可用地址,这意味这空闲空间对于任何一代都是可以进行使用的;
对于晋升阀值在默认是16,但是在ZGC中不在存在这个参数,一切都是程序自动调整的
分代ZGC的核心
- 无色根
- 可以获得更大的堆空间(16Tb -> 64Tb)
与ZGC进行对比,在使用1/4的内存下提升4倍的吞吐量