OpenJDK16 ZGC 源码分析(二)对象分配

1. 简介

自从JDK10中的引入了JEP 304: Garbage Collector Interface 后,OpenJDK定义了一整套关于GC的虚方法,供具体的GC算法实现。极大了简化了开发难度和代码的可维护性。

JEP 304定义了CollectedHeap类,每个GC都需要实现。CollectedHeap类负责驱动HotSpot的GC,以及和其他模块的交互。GC应当实现如下功能:

  • CollectedHeap的子类
  • BarrierSet集合类的实现,提供在运行时各种屏障功能。
  • CollectorPolicy类的实现
  • GCInterpreterSupport的实现,提供GC在解释执行时各种屏障功能(使用汇编指令)
  • GCC1Support的实现, 提供GC在C1编译代码中各种屏障功能
  • GCC2Support的实现, 提供GC在C2编译代码中各种屏障功能
  • 最终GC指定参数的初始化
  • 一个MemoryService,提供内存池、内存管理等

通常的,对象分配的入口在InstanceKlass::allocate_instance,该方法调用heap->obj_allocate()进行分配。

instanceOop InstanceKlass::allocate_instance(TRAPS) {
   
  bool has_finalizer_flag = has_finalizer(); // Query before possible GC
  int size = size_helper();  // Query before forming handle.

  instanceOop i;

  i = (instanceOop)Universe::heap()->obj_allocate(this, size, CHECK_NULL);
  if (has_finalizer_flag && !RegisterFinalizersAtInit) {
   
    // 对于实现了finalize方法的类的实例的特殊处理
    i = register_finalizer(i, CHECK_NULL);
  }
  return i;
}

2. CollectedHeap对象分配流程图

对象分配一般如下流程:
在这里插入图片描述

3. 源码分析

3.1 ZCollectedHeap

ZCollectedHeap重载了CollectedHeap的方法,其中包含了对象分配的相关方法。而核心逻辑在放在ZHeap中。ZCollectedHeap中主要的成员方法如下:

class ZCollectedHeap : public CollectedHeap {
   
  friend class VMStructs;

private:
  // 软引用清理策略
  SoftRefPolicy     _soft_ref_policy;
  // 内存屏障,解释执行/C1/C2执行时对象访问的屏障
  ZBarrierSet       _barrier_set;
  // 初始化逻辑
  ZInitialize       _initialize;
  // 堆管理的核心逻辑,包括对象分配、转移、标记
  ZHeap             _heap;
  // 垃圾回收线程,触发
  ZDirector*        _director;
  // 垃圾回收线程,执行
  ZDriver*          _driver;
  // 垃圾回收线程,统计
  ZStat*            _stat;
  // 工作线程
  ZRuntimeWorkers   _runtime_workers;
}

3.2 ZHeap

ZHeap是ZGC内存管理的核心类。主要变量如下:

class ZHeap {
   
  friend class VMStructs;

private:
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值