HotSpot虚拟机对象探秘

简单总结一下HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程

1. 对象的创建


①遇到new指令,在常量池中检查是否能定位到该类的符号引用,并检查这个符号引用代表的类是否已经加载、链接、初始化,没有则加载

②在堆内存中为对象分配空间
        分配方式:
            · 分配方式1:“指针碰撞”,Java堆内存绝对规整(实时调整)
            · 分配方式2:“空闲列表”,Java堆内存不规整
        解决修改指针的并发安全性:
            · CAS同步操作
            · 本地线程分配缓冲(TLAB)

③除了对象头,其它区域均初始化为零值

④对对象进行必要的设置
        对象类型信息(设置类型指针,指向方法区中的类型数据)
        GC分代年龄
        是否使用偏向锁等

⑤new指令执行后接着执行()方法,按照程序员的意向对对象进行初始化

2. 对象的内存布局

①对象头
    · Mark Word (hashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳、monitor指针等)
    · 类型指针(指向方法区中他的类型元数据的指针)
    · 数组长度(数组才有)

②实例数据
    字段内容,有顺序规则,且继承的字段包含

③对齐填充
    对象起始地址必须是8字节的整数倍  

3. 对象的访问定位

①使用句柄访问
    · 堆中划分出一块区域做为句柄池

通过句柄访问对象

②使用字节指针访问

通过直接指针访问对象

③对比:
    句柄访问的优势在于在对象被移动的时候只需要改变句柄池中的实例数据指针即可,栈内引用不需要
    直接指针访问的优势在于节省了一次指针定位的步骤

你可能感兴趣的:(HotSpot虚拟机对象探秘)