InterpreterRuntime::_new为解释器查找常量池后,发觉需要resolve类时候调用。方法在interpreterRuntime.cpp里面。
void InterpreterRuntime::_new(JavaThread* thread, constantPoolOopDesc* pool, int index){
klassOop k_oop = pool->klass_at(index, CHECK);
/*上面pool->klass_at调用constantPoolOopDesc::klass_at_impl。方法在klassOop k_oop =SystemDictionary::resolve_or_fail(name, loader, h_prot, true, THREAD)代码里面对类进行解析。这在《类的加载》里面有简单的描述。*/
instanceKlassHandle klass (THREAD, k_oop);
klass->check_valid_for_instantiation(true, CHECK);
//对klass进行初始化
klass->initialize(CHECK);
oop obj = klass->allocate_instance(CHECK);
thread->set_vm_result(obj);
}
具体分析一下allocate_instance
instanceOop instanceKlass::allocate_instance(TRAPS) {
bool has_finalizer_flag = has_finalizer(); // Query before possible GC
int size = size_helper(); // Query before forming handle.
KlassHandle h_k(THREAD, as_klassOop());
instanceOop i;
i = (instanceOop)CollectedHeap::obj_allocate(h_k, size, CHECK_NULL);
if (has_finalizer_flag && !RegisterFinalizersAtInit) {
i = register_finalizer(i, CHECK_NULL);
}
return i;
}
看看上面的size,size来自k_oop,在classFileParser::parseClassFile里
nstance_size = align_object_size(next_nonstatic_type_offset / wordSize);
jint lh = Klass::instance_layout_helper(instance_size, false);
this_klass->set_layout_helper(lh);
包含了类中非静态字段的大小。instance_size == align_object_size(instanceOopDesc::header_size() + nonstatic_field_size),这就是每个创建的对象中都会包含了object_header,object_header中的mark位可能会用做垃圾回收标志,锁标志等