目录
对象的创建过程
对象在jvm中创建过程如下:
(1)给对象分配内存
给对象分配内存有以下两种方式:
指针碰撞
我们内存分配为规整的(每次分配依靠指针位移来分配对象)(但是我们电脑给java分配的内存不一定是规整的,可能区域并不是连续的) 如图下所示
空闲列表
堆内部有一个列表来存储我们堆中空闲的地方。我们创建对象则去找列表中对应的空闲区域去创建我们的对象。
堆是否规整有我们垃圾回收器来决定的 ,如果垃圾回收带有我们的 压缩算法,那么他会规整的分配我们的对象
(2)规整分配线程安全问题
指针碰撞有线程安全问题使用cas无锁;
空闲列表则采用我们的本地线程分配缓存,线程占满则采用我们的cas加锁方式,再去 分配本地缓存分配一部分区域。
(3)初始化对象
(4)执行构造方法
对象结构
Header(对象头)
自身运行时数据(Mark Word)
类型指针:当前对象指向那个class对象,对应调用的方法也是调用class对象中的 方法
Instance Data(对象实例数据)
主要存放我们自身的 属性变量,包括父类属性等。
Padding(对象填充)
使用数据填充,没有实际的意义 HotStop 虚拟机指定对象大小必须是8个字节的整数倍。如果不是8个字节则,使用此进行填充
MarkWord:
哈希值、gc分代年龄、锁状态标志、线程持有的锁
分代的好处是可以更具不同的区域进行不同的回收算法
对象访问定位
我们如何去访问到对象的。
句柄引用
栈指向到句柄池(保存我们实例对象的地址),使用句柄池就不用改变变量指针应用。
直接指针引用
直接指针引用速度会比较快。
这个是和我们的java虚拟机有关常见hotSopt的虚拟机采用的是直接指针引用