当前位置: 首页 > 网络应用技术

JVM中对象布局的分析

时间:2023-03-07 21:06:50 网络应用技术

  根据Java虚拟机规范的说明:Java对象分为三个部分:对象标头,实例数据(实例数据)和填充。

  热点虚拟机的对象标头主要包括两个部分(如果阵列对象也包括数组的长度)信息,对象头在32 -bit System上占据了8bytes,而64个位置系统则占据16 bytes(打开压缩,指针)。

  实例数据部分是对象真正存储的有效信息(即新的对象信息),以及程序代码中定义的各种字段的内容。本机类型的内存(原始类型)的内存如下所示:

  参考类型在每个64位系统上占4个字节。

  对齐填充不一定存在。没有特殊的含义。因为热点VM的自动内存管理系统需要8个字节的对象的起始地址,即,对象的大小必须是8个字节的整数倍数(这是一个法规)。对象的标题是8个字节的倍数,因此,当对象实例的数据部分不对齐时,就需要通过对齐填充。

  热点对象头的定义是:http://openjdk.java.net/groups/hotspot/docs/hotspotglossary.html

  在阵列中,图像之后是归档的长度。请注意,Java对象和VM内部对象均具有公共对象标头格式。

  谷歌翻译:

  公共结构以每个GC管理开头。(每个OOP指向对象头。)包括有关布局,类型,GC状态,同步状态和身份的基本信息。数组,它遵循一个长度字段。请注意,Java对象和VM内部对象具有公共对象格式。

  因此,热点虚拟机的对象头主要包括两个部分:标记字和类型指针(Klass指针):

  Mark Word的大小在64位热点虚拟机中具有良好的音符,并且其大小为,而Klass指针则在打开压缩指针的情况下。

  PS:

  将其转换为以下表格:

  PS:我们知道,在处理并发时,通常是为了确保线程通过锁的安全性。例如,此锁实际上是对象头的锁定状态中的徽标,因此本文不仅是在同一时间解释目标头ISAT,还为实现理解的基础奠定了基础。

  通过上面的形式,您可以看到Java的对象头将在对象的不同状态中具有不同的表达式形式,主要在三个状态下:没有锁定状态,锁定状态和GC标记状态。锁定在Java中实际上可以理解,该对象已锁定,即更改对象头的状态,如果锁定成功,请输入同步代码块()。

  但是,Java中的锁分为多种类型。从上图可以看出,它通常分为三个锁:偏置锁,轻质锁和重量锁。这三个锁的效率完全不同。只有通过合理的设计代码,我们才能合理地使用三个锁和三个锁的原理?因此,我们需要先研究此对象头。

  对象在JVM中占用多少内存?对象obj = new Object()的字节是什么?

  我们可以从JOL(Java对象布局)工具中查看Java对象的内部布局,以及一个普通Java对象的字节占据了多少个字节。

  注意:以下测试都与压缩指针有关,默认值已打开。

  简介依赖性:

  1.创建一个新类A,该类不包括任何实例数据

  2.测试

  操作结果:

  其中没有字段,因此该对象的实例数据为0。因此,可能会导致两个问题:

  第一个问题是实例数据是新的对象信息。将布尔类型字段添加到A。我们知道布尔值在内存中占据(基本数据类型的0值布尔值为false):

  测试结果如下:

  尽管我们添加了Boolea类型的实例数据,但我们看到整个对象的大小仍然是对象头,布尔值B(对象的实例数据),其余的是填充数据对齐。如果定义一个int类型字段,它仅是4个字节而不填充。

  第二个问题是(对象头)中的存在是什么?在此之前,让我们首先了解末端的大小是多少。

  什么是尺寸结束模式?

  在JVM的定义中,对象头已经被称为Mark Word和Klass指针。

  在Mark Word中,有一个锁状态徽标。在初始新的情况下,默认值不是锁定,也就是说,在没有锁定的情况下,没有哈希,mark word的存储内容是:

  但是实际的比较发现,在前8个地方,显然已经使用了:

  这是JVM的错误吗?当然不是。在计算机系统中,我们将数据存储在字节中。每个地址单元对应于一个字节,1个字节为8位数字。但是,C语言中有不同的数据类型,而所占用字节的数量则不同。然后存在如何存储多个字节的问题。因此,出现大端存储模式和小端存储模式。

  在这里,说明什么是高和低字节以及高和低地址:

  这里的相应值对应于正面,因为它是小存储,因此我们只是反向打印。

  如果您计算哈希:

  测试结果如下:

  因此,在哈希码之前没有头部信息,您可以看到2b-8b之前的56位是毫无价值的。打印上述标准后,这是值得的。为什么它是2-8B,不应该是1-7B?主要原因是由于较小的端存储。第一字节中的八个是由年龄,偏见的锁定信息和对象状态分开的。不同表示的信息如下图所示。此图片将随object.down的状态而变化:

  对象的状态不会不变。随着锁的竞争,锁可以从锁升级到轻质锁,以及升级的重量级锁。

  注意:只需在这里查看结果,不要分析特定的实现,因此请不要询问为什么要升级,遵循 - UP文章。

  无锁状态是上述分析。

  检测结果:

  检测结果:

  检测结果:

  本文主要讨论了对象头中的信息,该信息随锁的扩展带来了,但是锁的扩展并未加深。实际上,锁的扩展主要是实现的。将来会提到。

  原始:https://juejin.cn/post/7102680319702073351