openjdk8\hotspot\src\share\vm\runtime\handles.cpp
调用的是real_allocate_handle(obj)
oop* HandleArea::allocate_handle(oop obj) {
assert(_handle_mark_nesting > 1, "memory leak: allocating handle outside HandleMark");
assert(_no_handle_mark_nesting == 0, "allocating handle inside NoHandleMark");
assert(obj->is_oop(), err_msg("not an oop: " INTPTR_FORMAT, (intptr_t*) obj));
return real_allocate_handle(obj);
}
Handle::Handle
openjdk8\hotspot\src\share\vm\runtime\handles.cpp
调用的是thread->handle_area()->allocate_handle(obj)
Handle::Handle(Thread* thread, oop obj) {
assert(thread == Thread::current(), "sanity check");
if (obj == NULL) {
_handle = NULL;
} else {
// real_allocate_handle(obj)
_handle = thread->handle_area()->allocate_handle(obj);
}
}
real_allocate_handle
openjdk8\hotspot\src\share\vm\runtime\handles.hpp
// Handle allocation
private:
oop* real_allocate_handle(oop obj) {
#ifdef ASSERT
oop* handle = (oop*) (UseMallocOnly ? internal_malloc_4(oopSize) : Amalloc_4(oopSize));
#else
oop* handle = (oop*) Amalloc_4(oopSize);
#endif
*handle = obj;
return handle;
}
HandleArea::allocate_handle
调用的是real_allocate_handle(obj)
#ifdef ASSERT
oop* allocate_handle(oop obj);
#else
oop* allocate_handle(oop obj) { return real_allocate_handle(obj); }
#endif
Amalloc_4
void *Amalloc_4(size_t x) {
assert( (x&(sizeof(char*)-1)) == 0, "misaligned size" );
if (_hwm + x > _max) {
return grow(x);
} else {
char *old = _hwm;
_hwm += x;
return old;
}
















