java对象头

对象是什么

Java是一个面向对象的语言,在Java中可以使用new关键字来产生一个对象,但这个对象到底是什么,应该具有哪些属性?

首先跟我们自己先想下,java对象已经有以下几个属性:

  1. 属于哪个类
  2. 有哪些字段和类型
  3. 对象的值 ….

在HotSpot虚拟机中,真实的Java对象是分成三个部分:

  1. 对象头
  2. 对象的值
  3. 对象的填充字节 (在JVM中,要求对象占用内存的大小应该是8bit的倍数,这个信息是用来补齐8bit的,无其他作用

对象头

对象头是java中对象都具有的属性,是jvm在编译和运行阶段读取的信息。对象头包含三个部分:

  1. mark word
  2. 指针向类的指针
  3. 数组的长度(只有数组的对象用到)

这3个中最复杂的是MarkWordMarkWord用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等。在32bit的环境中,java头存储的信息如下

对象头的应用



偏向锁

在HotSpot的虚拟机中,当一个线程访问同步块并尝试获取锁时,会在对象头和栈帧中的记录里存储锁的偏向的线程ID,以后该线程进入和退出同步块的代码时候,不需要再进行加锁 ,只需要检测下MarkWord中的是否是当前线程的偏向锁。如果成功,则说明已经获得了锁,如果检测不成功,就再进行加锁。

轻量级锁

线程在执行同步块之前,JVM会现在当前的线程的栈帧中创建用于存储锁记录的空间,并肩对象头的MarkWord复制到锁的记录中,然后线程尝试将对象头MarkWord替换为指向锁记录的指针,如果不成功,说明锁存在竞争,当前线程开始进行盲等来获取锁。

(本文完)

作者:老付 如果觉得对您有帮助,可以下方的订阅,或者选择右侧捐赠作者,如果有问题,请在捐赠后咨询,谢谢合作 如有任何知识产权、版权问题或理论错误,还请指正。 自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828:点击加群 或发我邮件 laofu_online@163.com

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 服务器CPU居高不下--解决问题历程

    在一个服务器的集群上面,服务器的CPU长时间居高不下,响应的时间也一直很慢,即使扩容了服务器CPU的下降效果也不是很明显。

    付威
  • Java多线程总结

    对于进程和线程的概念可以简单的理解成一个包含关系,例如:一个人个体可以称为社会的一个进程,人可以同时做很多事情,这个称之为线程

    付威
  • 如何使用正则表达式

    说到正则,可能很多人会很头疼这个东西,除了计算机好像很难快速的读懂这个东西,更不用说如果使用了。下面我们由浅入深来探索下正则表达式:

    付威
  • 异类框架BigDL,TensorFlow的潜在杀器!

    【导读】你能利用现有的 Spark 集群构建深度学习模型吗?如何分析存储在 HDFS、Hive 和 HBase 中 tb 级的数据吗?企业想用深度学习模型,可是...

    AI科技大本营
  • [android] 数据的异步加载和图片保存

    android.permission.MOUNT_UNMOUNT_FILESYSTEMS

    陶士涵
  • 当你写出User user = new User()时,JVM 都做了些什么

    如你所知,Java是一门面向对象的编程语言。我们平常在写代码的时候也是在不停的操作各种对象,那么当你在写出User user = new User();这样一行...

    IT大咖说
  • .NET GC 精要(一)

    稍有 .NET 基础的朋友一定知道 .NET GC 管理的是托管堆(managed heap)的内存释放问题,而托管堆又可以进一步分成两类:

    用户2615200
  • 和重复搭建开发环境说 Bye Bye 之Vagrant

    每每新同事入职,都要在自己电脑上配置一堆环境,费神费力;每每开发测试都要重新配置开发环境,手工搭建,步骤很繁琐,极易出错。

    马哥linux运维
  • 和重复搭建开发环境说 Bye Bye 之Vagrant

    每每新同事入职,都要在自己电脑上配置一堆环境,费神费力;每每开发测试都要重新配置开发环境,手工搭建,步骤很繁琐,极易出错。

    编程三分钟
  • 使用webflux提升数据导出效率

    两种方法目前看来用时差不多,不过后者可以避免超时。当然使用传统mvc也可以实现类似效果,就是拿到response的输出流不断地write和flush。不过web...

    codecraft

扫码关注云+社区

领取腾讯云代金券