当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。
对象创建
- 在方法区去寻找类的符号引用,并检查这个类是否被类加载过
- 为新生对象分配内存
分配方式有两种:
- 指针碰撞(规整):指针往空闲内存方向移动一定距离
- 空闲列表:在内存空间表里面查找空闲内存并分配
- 将分配到的内存置0
- 初始化对象头
- 执行init<>()
MarkWord:
具体流程如下:
对象访问
句柄访问:
直接指针: