Java运行时环境---内存划分 (3)

3、分配内存结束后,JVM将分配到的内存空间都初始化为零值(不包括对象头【Object Header第一部是Mark Word用,于存储对象自身的运行时数据,第二部分是类型指针,用于确定这个对象是哪个类的实例】);这一步保证了对象的实例字段在Java代码中可以不用赋值就能够直接使用,且程序能访问到这些字段的数据类型所对应的零值;

4、对Object进行必要的设置,如该对象属于哪个类的实例、任何才能访问到类的元数据信息、对象的哈希值、对象的GC分代年龄等信息,这些信息存放在Object的对象头中;

5、执行<int>方法,把对象按照程序猿的意愿进行初始化,这样一个真正可用的对象就完完全全的产生了。 

对象的访问定位

在Java中需要通过栈上的reference(引用)数据来操作堆上具体对象;比如创建一个对象 String name = new String(); ,其中new String()其实有两部分,一部分是类数据(如代表类的Class对象),另一部分则是实例数据;由于reference在JVM中只是一个指向对象new String()的引用name,并没有规定name应该通过何种方式去定位及访问Heap中对象的具体位置,So对象访问的最终方式还是由虚拟机决定的,目前主流方式有两种:

case1: 指针访问,java堆对象的布局中必须考虑如何放置访问类型数据的相关信息,该访问方式下reference中存储的就是对象地址;

case2: 句柄访问,java堆中将会划分出一块内存作为句柄池,此访问方式reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwysfs.html