Java实习生面试复习(十三):Java对象的创建、内存布局、访问

导读:本篇文章讲解 Java实习生面试复习(十三):Java对象的创建、内存布局、访问,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

如果你觉得内容对你有帮助的话,不如给个赞,鼓励一下更新😂。

对象的创建

  • 检查类的加载
    • 虚拟机遇到 new 指令时,会先检查在常量池中能不能定位到一个类的符号引用,检查是否已经被加载,解析和初始化过。
  • 分配内存
    • 指针碰撞
    • 空闲列表
  • 初始化零值
    • 内存分配完毕后,虚拟机需要将分配到的内存空间全部初始化为零值
  • 设置对象头
    • 虚拟机要对对象进行必要的设置,比如类的元数据信息,对象的哈希码,对象的GC分代年龄等信息

在上面工作完成之后,从虚拟机的视角来看,一个新的对象已经产生,但从程序角度来看,对象创建才开始 – 方法还没执行

对象的内存布局

对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充

  • 对象头
    • Mark Word:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID
    • 类型指针
    • 如果对象是一个Java数组,那么对象头中还必须有一块用于记录数组长度的数据
  • 实例数据
  • 对齐填充
    • 它并不是必须存在的,因为对象的大小必须是8字节的整数倍,而对象头正好是8字节的倍数,所以当对象实例数据没有对齐时,就需要对齐填充。

在现今64位的jvm虚拟机上对象头为 96bit = 12byte

  • Java对象头:96bit
  • Mark Word:64bit 8byte
  • klass pointer: 32bit 4byte / 64bit 8byte

因为有的虚拟机默认开启了指针压缩,所以是32bit 4byte
Java实习生面试复习(十三):Java对象的创建、内存布局、访问

对象的访问定位

目前主流的访问方式有两种:

  • 使用句柄

如果使用句柄访问的话,那么句柄中会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。
在这里插入图片描述

好处:使用句柄访问就是reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中实例数据的指针,而reference本身不需要改动。

  • 直接指针

在这里插入图片描述

好处:使用直接指针最直观的好处就是速度快,它节省了一次指针定位的时间开销。

这篇文章到这就结束啦,喜欢的话就给个赞 + 收藏 + 关注吧!🤓
有什么想看的欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15201.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!