ZGC垃圾收集器-JVM(十五)

上篇文章说了G1的特性,无分代,复制算法,大内存就可以用G1,可预测stw时间等特性。

G1垃圾收集分类-JVM(十四)

  • ZGC收集器

-XX:+UseZGC

ZGC(Z Garbage Collector)是在jdk11新加入的低延迟垃圾收集器。

Zgc有四个目标

  1. 支持至少TB级别堆内存回收。(目前4TB)
  2. STW保持在10ms之内。
  3. 吞吐量稍微降低,不会降低超过百分之15
  4. 奠定未来GC收集器的基础。

Oracle官方介绍,不会因为内存的增大而增大,意味着几十G的堆,gc停顿时间不会超过10ms。

Zgc暂时没有分代,因为内部算法太复杂,实现分代太麻烦,暂时用单代版本,后续会优化,可能就支持更高的TB内存服务器。

NUMA-aware

UMA(Uniform Memory Access Architecture)表示内存只有一块,所有CPU都在这块内存运行,那么就存在竞争关系,争夺内存的访问权,有竞争就有锁,必然影响效率,CPU内核越多则竞争越激烈。所以与之而来,有了NUMA(Non Uniform Memory Access Architecture)直接每个CPU对应独有的内存块,且在主板上,这个CPU离对应的内存块是最近的,自然性能很高。

  • ZGC运作过程

运作过程大致分为四个阶段,并发标记,并发预配重分配,并发重分配,并发重映射

  1. 并发标记(Concurrent Mark):与G1一样,可达性算法从GC roots遍历,初始标记(mark start)和最终标记(mark end)也会出现短暂停顿,与G1不同的是遍历的不是对象,而是指针,标记阶段会更新指针颜色

(cms和g1有三色标记,在对象头里,但是zgc的并发标记跟对象没关系,而是放在内存存储空间的指针上)

2、并发预备重分配(Concurrent Prepare for Relocate):这个阶段需要根据特定条件统计本次收集过程需要清理哪些region,将这些region组成重分配集(Relocation Set)。ZGC每次回收都会扫描所有的region,用范围更大的扫描成本换省去G1记忆集的成本。

3、并发重分配(Councurrent Relocate):重分配是ZGC核心阶段,这个过程要把重分配存活对象复制到新的region,并为重分配集的每个region维护一个转发表(Forward table),记录旧对象到新对象转换关系。Zgc收集器仅从引用就能知道对象是否处于重分配中,如果用户线程此时访问了重分配对象,这次访问会被预置的内存屏障(读屏障)所截获,然后根据region上转发表到新复制对象上,并同时修正该引用值,使其直接指向新对象,zgc这种行为称为指针的“自愈”能力。

4、并发重映射(Coucurrent Remp):重映射所做的就是修正整个堆中指向重分配集旧对象所有引用,但是ZGC自愈功能,所以这个重映射不是很迫切。ZGC巧妙的把重映射要做的工作,合并到下一次垃圾收集器循环并发标记阶段去完成,反正他要遍历所有对象,这样就可以节省开销。一旦所有指针被修正,原来记录新旧关系的转发表也可以释放。

  • 颜色指针

Coloored Pointers,颜色指针。

64位处理器,只需要42位来寻址,2^42则是4TB。后面版本jdk改为44位寻址,2^44则就是16TB。

另外四位做标记,比如marked1、marked0、finalizable标识和remapped标识。

Finalizable:就是三色标记,但不限于三种颜色,此位并发处理,表示对象通过此访问。

Remapped:对象未指向relocation set中,relocation set表示需要gc的region集合。

剩余18位还未使用,预留给以后使用。

你可能感兴趣的:(后端,jvm)