Java对象的创建及访问

来源:互联网 发布:java代码调用ant出错 编辑:程序博客网 时间:2024/05/06 20:11

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

        第一步:加载类。

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

        第二步:分配内存。

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

        第三步:设置参数。

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

        第四步:初始化。

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


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

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

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

1、使用句柄。

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

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

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


0 0