此处指普通Java对象的创建,不包括数组、Class对象。
JVM遇到一条new指令时,会执行以下动作。
1.检查类的加载
if((这条指令的参数能否在常量池中找到一个类的符号引用)&&(这个符号引用代表的类已经被加载、解析、初始化)) {
//类已经加载
}
}else {
执行加载过程
}
2.为新建的对象分配内存,所需内存大小在类加载完成后已经确定。
if(堆内存是规整的) {
指针碰撞
}else {
空闲列表
}
Java堆的内存是否规整由垃圾收集器是否有压缩整理功能决定。
保证线程安全:
同步锁定:对分配内存的动作进行同步处理,保证原子性。
本地线程分配缓冲(TLAB):每个线程在Java堆中预分配一小部分内存。当线程T要分配内存,就在对应的的TLAB上分配。当TLAB用完,要分配新的TLAB,才同步锁定。
3.将分配的内存空间初始化为零值,将对象信息写入对象头
零值,不是程序员设置的默认值。
这里初始化不包括对象头。
使用TLAB时,可以提前至TLAB分配时进行。
保证对象实例可以不赋初始值就直接使用。
至此一个对象已经产生并可以使用了,但是还没有完成创建过程——所有字段还是零值。
4.初始化
执行<init>方法,按照程序员的意愿对对象进行初始化,得到真正可用的对象。