一、创建过程
对象创建过程.png二、重点说明
1.在Java堆中为对象分配内存空间
分配方法
有两种主流方法:指针碰撞;空闲列表。
具体使用哪一种取决于堆是否规整,堆是否规整取决于JVM所采用的垃圾回收器是否具有压缩整理功能。
分配时的线程安全问题
解决方法:
- 分配内存空间的动作进行同步处理——实际上虚拟机采用CAS配上失败重试的方法
- 把内存分配的动作按照线程分配在不同的空间中进行(Thread Local Allocation Buffer,TLAB)。哪个线程要分配内存,就在线程的TLAB上分配,当TLAB用完重新分配时进行加锁。
2.虚拟机将分配到的内存空间(不包括对象头)都初始化为零值
对象的内存布局是:对象头,实例数据,对齐填充
- 对象头:1)存储对象自身运行时的数据(哈希码、GC分代年龄、锁标志等);2)类型指针,指向它的类元数据(通过该指针知道它是哪个类的实例)【该区域可无】
- 实例数据:就是类中声明的实例变量的值(无论是从父类继承下来的,还是在子类中定义的,都要记录下来)
- 对齐填充:无实际意义。因为JVM要求对象占用的存储空间必须是8字节的整数倍,故通过对齐填充来补齐
3.<init>
由编译器自动收集类中所有实例变量 声明时赋的初值、初始化块中赋的初值、构造函数中赋的初值。
网友评论