对象在堆中
1.创建对象
这里的对象(指普通对象,不包括数组、Class对象等);
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一***个类的符号引用***,并且检查这个符号引用代表的类是否被加载、解析、或初始化过,没有先执行类加载过程,接下来为对象分配内存,并执行方法为字段赋初始化值;
2. 对象在java堆内存中的布局
对象在内存中存储的布局分为:对象头、实例数据、对齐填充;
对象头:包括两部分(1)、存储对象自身的运行时数据(如:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID、偏向时间戳等),这部分数据在32位和64位虚拟机中分别为32bit和64bit(2)、类型指针即对象指向他的类元数据的指针,通过该指针找到这个对象是哪个类的实例;
实例数据:字段,无论是从父类继承还是子类中定义的;
对其填充:不是必然存在,也没有特殊含义,仅起占位符的作用;
3. 访问对象
两种主流的访问方式:
***1. 句柄方式访问:***java堆中将划分一部分内存来作为句柄池,栈中引用存储的是对象的句柄地址,而句柄中存储的是对象实例数据地址和类型数据(静态成员变变量)的具体地址;
***2. 指针方式访问:***引用中存储的是对象的起始地址,而对象布局中必须考虑如何放置访问类型数据的相关信息;
…(img-uh5nPzYZ-1594971105594)]