JVM碰到new指令
1. 检查此指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析、初始化。
- 符号引用:编译时每个java类会被编译为一个class文件,但编译时JVM不知道所引用类的地址,所以以符号引用来代替,解析时转化为真正的地址。
2. JVM为新生对象分配内存
- 内存分配方法:“指针碰撞”——内存规整,以指针作为分界点;
- “空闲列表”——记录那些内存可用
- 潜在问题:对象创建过于频繁
- 解决方案:对分配内存空间的动作进行同步处理;
- 把内存分配的动作按线程划分在不同的空间中进行——每个线程在Java堆中预先分配一小块内存(本地线程分配缓存,TLAB)
3. 初始化
- 除对象头外,将分配到的内存空间都初始化为0;
- 进行必要设置(存放在对象头中)——属于哪个类的实例、如何找到元数据信息、对象hash码、对象GC分代年龄等信息
4.执行<init>方法,按照程序员的意愿进行初始化,至此,一个对象创建完成。
对象内存布局