Java对象的创建及访问

        在Java中创建对象只是一个new关键字而已,如 Object Obj=new Object();但是在虚拟机中,这是一个复杂的过程。整个对象的创建分为四步。

        第一步:加载类。

                       Java虚拟机遇到一条new指令时,先去检查这个指令的参数(即:类名)是否能在常量池中定位到这个类的符号引用,并检查这个符号所代表的类是否已经备加载、解析和初始化(参见Java类的加载过程)。如果类没有被加载,必须先执行类的加载过程。

        第二步:分配内存。

                      在类加载检查通过后,虚拟机讲为新的对象分配内存。所分配的内存的大小由类的加载过程中确定。这块内存被分配在Java堆中。内存分配完成后虚拟机将分配到的所有内存空间都初始化为零(之所以全部初始化为零,是为了保证对象的实例字段在Java代码中可以不赋初值直接使用)。

        第三步:设置参数。

                      接下来虚拟机需要对对象进行必要的设置。如这个对象属于哪个类的实例,如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等。这些信息存放在对象的对象头中。

        第四步:初始化。

                       从虚拟机的视角,一个新的对象已经产生,但是从Java程序的视角来看对象的创建才刚刚开始。还需要对对象执行init方法。


在创建完对象之后就需要对对象进行访问。

Java程序通过栈上的reference数据来操作堆上的具体对象。reference时一个指向对象的引用。

目前主流的访问方式有使用句柄和直接指针两种。

1、使用句柄。

        Java堆中hi划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址。句柄中抱恨了对象实例数据与类型数据各自的具体地址。

使用句柄访问的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动是只会改变句柄中的实例数据指针,而reference本身不需要改变。

使用直接访问的最大好处就是快,节省了一次指针定位的开销。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值