本篇首先介绍几个与句柄分配与释放密切相关的类,然后重点介绍句柄的释放。
1、HandleArea、Area与Chunk
句柄都是在HandleArea中分配并存储的,类的定义如下:
// Thread local handle areaclass HandleArea: public Arena {
friend class HandleMark; ... HandleArea* _prev; // HandleArea通过_prev连接成单链表 public: // Constructor HandleArea(HandleArea* prev) : Arena(Chunk::tiny_size) {
_prev = prev; } // Handle allocation private: oop* real_allocate_handle(oop obj) { // 分配内存并存储obj对象 oop* handle = (oop*) Amalloc_4(oopSize); *handle = obj; return handle; } // ... };
real_allocate_handle()用来在HandleArea中分配内存并存储obj对象,方法会调用父类Arena中定义的Amalloc_4()函数。HandleArea的父类Arena的定义如下:
// Fast allocation of memoryclass Arena: public CHeapObj {
protected: ... Chunk *_first; // First chunk Chunk *_chunk; // current chunk char *_hwm, *_max; // High water mark and max in current chunk void* grow(size_t x); // Get a new Chunk of at least size x size_t _size_in_bytes; // Size of arena (used for memory usage tracing)public: Arena(); Arena(size_t init_size); Arena(Arena *old