对象的内存分配有两种方式,一种是指针碰撞另一种是空闲列表的方式,堆是否规整由咱们垃圾回收器来决定的 ,若是垃圾回收带有咱们的压缩算法,那么他会规整的分配咱们的对象。java
咱们内存分配为规整的,每次分配依靠指针位移来分配对象,若是在多线程建立对象的状况下是经过在CPU硬件层面上加锁CAS锁来保证数据安全,如图下所示算法
堆内部有一个列表来存储咱们堆中空闲的地方。咱们建立对象则去找列表中对应的空闲区域去建立咱们的对象。每一个线程建立对象,都会被分配必定的内存缓冲区,当缓冲区不够的时候可能会出现多个线程以同一抢占新的内存空间,这里的抢占也是基于CAS锁实现,以下图数组
指针碰撞有线程安全问题使用cas无锁在CPU硬件层面家锁缓存
空闲列表则采用咱们的本地线程分配缓存,线程占满则采用咱们的cas加锁方式,再去分配本地缓存分配一部分区域。安全
自身运行时数据(Mark Word)
哈希值 gc分代年龄 锁状态标志 线程持有的锁
分代的好处是能够更具不一样的区域进行不一样的回收算法
类型指针:当前对象指向那个class对象,对应调用的方法也是调用class对象中的方法
数组长度 只有数组才会有这个值
主要存放属性变量,包括父类属性等。
使用数据填充,没有实际的意义 HotStop 虚拟机指定对象大小必须是8个字节的整数倍。若是不是8个字节则,使用此进行填充
对象的访问分为句柄引用和直接指针引用多线程
栈指向到句柄池(保存咱们实例对象的地址),使用句柄池就不用改变变量指针应用。spa
直接指针引用速度会比较快。咱们的java虚拟机有关常见hotSopt的虚拟机采用的是直接指针引用线程