1. 简介
ZGC的对象分配流程大体与G1类似。分配流程图在JVM G1 源码分析(二)- 对象的堆空间分配内。
主要代码在src/hotspot/share/gc/shared目录下,为多个GC算法的共用代码。
ZGC定制逻辑由gc shared代码调用ZCollectedHeap、ZHeap等ZGC派生类实现。
2. 源码分析
2.1 allocate_new_tlab
当线程的TLAB可用内存不足时,MemAllocator的allocate_inside_tlab_slow会调用ZCollectedHeap的allocate_new_tlab申请新的TLAB。
- 分配前,先对象字节对齐,默认8字节对齐
- 调用ZHeap的alloc_tlab进行分配
zCollectedHeap.cpp
HeapWord* ZCollectedHeap::allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size) {
const size_t size_in_bytes = ZUtils::words_to_bytes(align_object_size(requested_size));
const uintptr_t addr = _heap.alloc_tlab(size_in_bytes);
if (addr != 0) {
*actual_size = requested_size;
}
return (HeapWord*)addr;
}
alloc_tlab在校验size合法性后,调用ZObjectAllocator的alloc_object进行分配。
- TLAB的最大size为常量ZObjectSizeLimitSmall,即2MB
zHeap.inline.hpp
inline uintptr_t ZHeap::alloc_tlab(size_t size) {
guarantee(size <= max_tlab_size(), "TLAB too large");
return _object_allocator.alloc_object(size);
}
ZObjectAllocator的alloc_object根据需要分配的size分别调用alloc_small_object、alloc_mediu