JVM笔记二:jvm中对象的创建
发布日期:2021-05-28 16:44:48 浏览次数:6 分类:技术文章

本文共 1024 字,大约阅读时间需要 3 分钟。

JVM笔记二:对象

文章目录

对象的创建

  1. java对象创建底层执行图

java对象创建顺序

  1. 创建对象流程

1、虚拟机遇到一个new指令时,首先检查这个对应的类能否在常量池中定位到一个类的符号引用。

2、判断这个类是否已被加载、解析和初始化。

3、为这个新生对象在java堆中分配内存空间,其中java堆分配内存空间的方式主要有两种:指针碰撞,空闲列表

4、将分配到的内存空间都初始化为零值。

5、设置对象头相关数据。

​ GC分代年龄,对象的hassh码和hashCode,元数据信息

6、执行对象方法。(static方法)

  1. 指针碰撞

1、分配内存空间包括开辟⼀块内存和移动指针两个步骤

2、⾮原⼦步骤可能出现并发问题,Java虚拟机采⽤CAS配上失败重试的⽅式保证更新

操作的原⼦性

  1. 空闲列表

1、分配内存空间包括开辟⼀块内存和修改空闲列表两个步骤

2、⾮原⼦步骤可能出现并发问题,Java虚拟机采⽤CAS配上失败重试的⽅式保证更新

操作的原⼦性(CAS乐观锁原理)

对象的内存布局

  1. 对象头

1、对象头用于存储对象的元数据信息,包括对象运行时的数据和类型指针。

2、MarkWord部分存储对象自身的运行时数据如哈希值,GC分代年龄,锁状态标识,线程持有锁,偏向锁ID,偏向锁时间撮。

3、类型指针指向它的类元数据的指针,用于判断对象属于那个类的实例。

  1. 实例数据

实例数据存储的是真正有效的数据

如各种字段内容,父类定义的变量会出现在子类定义的变量的前面。

  1. 对齐填充

起到占位符的作用,并非必须。实例数据无法保证8的倍数,就是让实例数据保证8的倍数。

访问对象过程

  1. 当我们在堆上创建⼀个对象实例后,就要通过虚拟机栈中的reference类型数据来操作堆上的对
    象。现在主流的访问⽅式有两种(HotSpot虚拟机采⽤的是第⼆种):

1、使⽤句柄访问对象。即reference中存储的是对象句柄的地址,⽽句柄中包含了对象实例数据

与类型数据的具体地址信息,相当于⼆级指针

2、直接指针访问对象。即reference中存储的就是对象地址,相当于⼀级指针。

直接指针访问对象

对象句柄访问

  1. 二者区别

1、垃圾回收分析:⽅式1当垃圾回收移动对象时,reference中存储的地址是稳定的地址,不需

要修改,仅需要修改对象句柄的地址;⽅式2垃圾回收时需要修改reference中存储的地址。

2、访问效率分析,⽅式⼆优于⽅式⼀,因为⽅式⼆只进⾏了⼀次指针定位,节省了时间开销,

⽽这也是HotSpot采⽤的实现⽅式。

转载地址:https://blog.csdn.net/qq_33322074/article/details/105478509 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Jdk8新特性三:jdk8之函数式编程Function
下一篇:记一次解决Hype-v的端口占用问题

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年02月17日 16时07分03秒