InterpreterRuntime::_new阅读

本文详细解析了Java中对象创建的过程,重点介绍了InterpreterRuntime::_new方法如何通过解析类来分配对象,并涉及到了对象布局和垃圾回收标记等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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位可能会用做垃圾回收标志,锁标志等

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值