Java对象头的组成_java对象头结构-CSDN博客
JAVA中new Object对象占用多少字节,Java对象的组成是哪些?Java对象头的组成又是哪些,MarkWord是什么,有什么作用?
一、JAVA对象的结构组成
JAVA Object对象的结构组成:
java对象由三部分组成: 对象 = 对象头+实例数据+对齐填充
对象头也有三部分组成:对象头=Mark word + MeaData + 数组长度
MarkWord: 记录着线程同步锁状态、线程id、标识、hashcode、GC状态等等。
MeaData: 元数据指针,指向元空间
数组长度:(类包含了数据对象,才有数组长度)
在Java中,一个对象占用的内存空间并不是固定不变的,它取决于多个因素,包括对象本身的数据成员(包括从父类继承的)、对象引用的类型(比如是32位还是64位JVM)、JVM的实现以及可能的JVM调优参数等。因此,要精确计算一个对象占用的内存空间是比较复杂的。
不过,我们可以从一些基本概念出发,来大致估算一个对象所占用的内存:
-
对象头(Object Header):每个Java对象都有一个对象头,它包含了对象的一些元数据,如哈希码(HashCode)、GC分代年龄(Generational GC Age)、锁状态标志(Lock Status)、线程持有的锁(Thread holding monitors on object)、偏向线程ID(Biased Locking)、偏向时间戳(Biased Locking epoch)等。这个对象头的大小在32位和64位JVM上有所不同。在32位JVM上,普通对象的对象头通常占用8字节(Mark Word)+ 4字节(Class Metadata Address),但在开启压缩指针的64位JVM中,对象头可以压缩到12字节或更少。
-
实例数据(Instance Data):对象本身的数据成员所占用的空间。这取决于对象声明的属性,包括基本数据类型(如int, double等)和引用类型(如String, 其他对象引用等)。基本数据类型的大小是固定的,而引用类型的大小则取决于JVM是32位还是64位(在32位JVM中通常是4字节,在64位JVM中通常是8字节,但可以通过JVM参数来启用压缩指针以减小这个大小)。
-
对齐填充(Padding):JVM会自动在对象数据之后添加一些填充字节,以确保对象的大小是某个字节的倍数(通常是8字节),这样可以提高内存访问的效率。
由于上述因素的复杂性,通常我们不会手动去计算一个对象的确切内存大小。但是,我们可以使用一些工具来帮助我们估计,比如:
- Java Instrumentation API:通过编写一个agent来监控JVM中对象的内存使用情况。
- JVM参数:通过设置JVM参数(如
-XX:+PrintGCDetails
、-XX:+HeapDumpOnOutOfMemoryError
等)来获取更详细的GC日志或堆转储,进而分析对象的内存占用。 - 专业工具:使用如VisualVM、Eclipse Memory Analyzer Tool (MAT)、JProfiler等专业的Java性能分析和内存分析工具来查看对象的内存占用情况。
二、JAVA对象头的结构组成
Mark Word是Java虚拟机(JVM)中对象头(Object Header)的一个重要组成部分,它用于存储对象的元数据和运行时信息。具体来说,Mark Word包含了关于对象的一系列重要标记位和信息,如对象的哈希码(HashCode)、锁状态、GC分代信息等。这些信息对于JVM的垃圾回收(GC)机制、线程同步以及对象的快速比较和定位等操作至关重要。
Mark Word的主要特点:
-
大小:在64位JVM中,Mark Word通常占用8字节的内存空间。虽然这个大小在不同的JVM实现和版本中可能有所不同,但8字节是一个常见的配置。
-
内容可变:Mark Word的具体内容可以根据对象的类型和状态而变化。例如,一个未被锁定的对象和一个正在被线程持有的锁对象,其Mark Word中的锁状态信息就会不同。
-
重要性:Mark Word是JVM进行垃圾回收和线程同步的基础。它帮助JVM识别哪些对象是可以被回收的,以及哪些对象正在被线程使用并需要保持其状态的一致性。
Mark Word包含的信息:
- 哈希码(HashCode):用于实现对象的快速比较和定位。
- 锁状态:用于支持对象的同步和线程安全。根据JVM的实现和版本,锁状态可以包括无锁、偏向锁、轻量级锁和重量级锁等不同的级别。
- GC分代信息:用于标记对象的年龄和存活状态,以便进行垃圾回收。这有助于JVM优化垃圾回收过程,提高内存使用效率。
Mark Word的作用:
- 垃圾回收:通过Mark Word中的GC分代信息,JVM可以识别哪些对象是可以被回收的,从而执行垃圾回收操作,释放内存空间。
- 线程同步:Mark Word中的锁状态信息支持了Java的线程同步机制。通过锁状态的变化,JVM可以控制多个线程对共享资源的访问,确保线程安全。
- 性能优化:Mark Word的设计还考虑到了性能优化的需求。例如,通过减少对象头的大小或使用压缩指针等技术,可以减少对象的内存占用,提高内存使用效率。
综上所述,Mark Word是Java虚拟机中一个非常重要的数据结构,它存储了对象的元数据和运行时信息,支持了JVM的垃圾回收和线程同步机制,并有助于优化内存使用和提高性能。