对象的创建
HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。
- ①类加载检查:是否能在常量池中定位到这个类的符号引用
虚拟机遇到一条 new 指令时,首先检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
- ②分配内存:对象所需的内存大小在类加载完成后便可确定
把一块确定大小的内存从 Java 堆中划分出来,为新生对象分配内存。
内存分配的两种方式:
指针碰撞 :用过的内存全部整合到一边,没有用过的内存放在另一边
空闲列表 :虚拟机会维护一个列表,该列表中会记录哪些内存块是可用的
- ③初始化零值:将分配到的内存空间都初始化为零值
- ④设置对象头: 对对象进行必要的设置
- ⑤执行 init 方法:,把对象按照程序员的意愿进行初始化
对象的访问
- 通过栈上的 reference 数据来操作堆上的具体对象。
- 访问方式有:句柄、直接指针。
1、句柄:
- 堆中将会划分出一块内存来作为句柄池。
- reference 中存储的就是对象的句柄地址。
- 句柄中包含了对象实例数据与类型数据各自的具体地址信息。
- 优点:reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改。
2、直接指针:
- reference 中存储的直接就是对象的地址。
- 好处:使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。
参考:
https://juejin.cn/post/6875638406165037063
https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484884&idx=1&sn=0d9b841ce0fc300c78ade2a87ffbfb46&source=41#wechat_redirect