对象的创建
1、虚拟机遇到一条new指令时, 首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用, 并且检查这个符号引用代表的类是否已被加载、 解析和初始化过。 如果没有, 那必须先执行相应的类加载过程。在类加载检查通过后, 接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。
2、对对象头设置
3、执行<init>方法,把对象按照程序员的意愿进行初始化
对象的内存布局
1、对象头:一部分是:哈希码( HashCode) 、 GC分代年龄、 锁状态标志、 线程持有的锁、 偏向线程ID、 偏向时间戳等,这部分数据的长度在32位和64位的虚拟机( 未开启压缩指针) 中分别为32bit和64bit,它会根据对象的状态复用自己的存储空间。另一部分是类型指针, 即对象指向它的类元数据的指针
2、实例数据
3、对齐填充
对象的访问定位
1、句柄访问:好处是reference中存储的是稳
定的句柄地址,在对象被移动(垃圾收集时移动对象是非常 普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改。
2、直接指针访问:最大好处是速度更快,节省了一次指针定位的时间。(HotSpot用的)