ResourceMark类的主要成员以及方法
- ResourceMark继承StackObj,表示它是分配在栈上的, 它内部持有 ResourceMarkImpl实现类的引用.在构造函数中,会初始化ResourceMarkImpl类的构造方法传入当前线程的ResouceArea对象。
class ResourceMark: public StackObj {
const ResourceMarkImpl _impl;
// 构造方法
ResourceMark(ResourceArea* area, Thread* thread) :
_impl(area),
_thread(thread),
_previous_resource_mark(nullptr)
{
if (_thread != nullptr) {
assert(_thread == Thread::current(), "not the current thread");
_previous_resource_mark = _thread->current_resource_mark();
_thread->set_current_resource_mark(this);
}
}
public:
ResourceMark() : ResourceMark(Thread::current()) {}
explicit ResourceMark(Thread* thread)
: ResourceMark(thread->resource_area(), thread) {}
explicit ResourceMark(ResourceArea* area)
: ResourceMark(area, DEBUG_ONLY(Thread::current_or_null()) NOT_DEBUG(nullptr)) {}
void reset_to_mark() { _impl.reset_to_mark(); }
};
ResourceMark的实现类ResourceMarkImpl构造函数和方法
- 构造函数传入当前线程的ResourceArea对象,保存到_area变量。 并调用SavedState构造函数初始化_saved_state变量。 然后再函数体重调用ResourceArea的activate_state校验当前资源状态,并且将_nesting变量加1。
class ResourceMarkImpl {
ResourceArea* _area;
ResourceArea::SavedState _saved_state; // ResourceArea的快照
public:
explicit ResourceMarkImpl(ResourceArea* area) :
_area(area),
_saved_state(area)
{
_area->activate_state(_saved_state);
}
explicit ResourceMarkImpl(Thread* thread)
: ResourceMarkImpl(thread->resource_area()) {}
};
SavedState是保存ResourceArea当前使用状态的快照。
class SavedState {
friend class ResourceArea;
Chunk* _chunk;
char* _hwm;
char* _max;
size_t _size_in_bytes;
public:
SavedState(ResourceArea* area) :
_ch