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: