对象
对象的创建
类加载检查
遇到字节码new指令,检查指令的参数是否能在常量池中定位一个类的符号引用,检查这个符号引用代表的类是否已经加载、解析和初始化过,如果没有则进行类加载;- 内存分配
为新生对象分配内存- 指针碰撞(Bump The Pointer)
假设Java堆中的内存绝对规整,所有使用过的内存放在指针一边,未使用过的内存在另一边,需要内存时指针向未使用区域移动 - 空闲列表(Free List)
假设Java堆中空闲和已用内存混在一起,需要JVM维护一个列表,分配时在空闲列表找寻足够大的空间分配给实例并更新列表上的记录。 - Java堆是否规整由垃圾收集器是否带有空间压缩整理能力决定
- 线程安全问题
- 对分配内存空间的动作进行同步处理,JVM采用CAS+失败重试保证更新操作的原子性
- 把内存分配的动作按照线程划分在不同的空间中进行(TLAB)
-XX:+/-UseTLAB
- 指针碰撞(Bump The Pointer)
初始化
将分配到的内存空间全部初始化为0- JVM对对象进行必要设置:
- 对象隶属于哪个类的实例,类的元数据信息
- 对象的哈希码,GC分代年龄
- 是否启用偏向锁
JVM创建实例完成,运行构造函数进行初始化