浅谈Java Object对象在Heap中的结构
介绍
Java内存分为栈内存和堆内存,栈内存用于存储局部变量和方法调用的信息,而堆内存用于存储动态分配的对象和数组。在堆内存中,Java对象存储在对象头和对象实例数据两部分中。
Java对象头结构
Java对象在内存中的结构包括对象头和对象实例数据两部分,对象头的大小在不同的JVM实现中有所不同,取决于虚拟机的实现和目标平台,一般包括以下内容:
-
Mark Word(标记字段):用于存储对象的运行时数据,包括锁信息,GC分代年龄等,占用长度为8字节(64位虚拟机)或4字节(32位虚拟机)。
-
Klass Pointer(类型指针):用于指向该对象所属的类类型信息,占用长度为4字节。
-
数组长度(如果是数组):用于表示该数组的长度,占用长度为4字节。
-
对齐填充:用于对齐对象实例数据的起始位置,占用长度为补齐的字节数。
Java对象实例数据结构
Java对象的实例数据包括对象的成员变量,字面量和数组元素等。其中对象成员变量在对象中的排列顺序与原始的Java类中定义的成员变量的顺序相同。对于非对象类型(如int,float等)的实例变量,它们直接存储在对象实例数据中,而对于对象类型的实例变量,实际上存储的是对象引用,在堆内存中由该对象引用指向实际的对象实例数据。
示例说明
下面给出两个例子来说明Java对象在堆内存中的结构:
- 对象实例变量
对于下面的代码片段:
public class Employee {
private String name;
private int age;
private Department department;
public Employee(String name, int age, Department department) {
this.name = name;
this.age = age;
this.department = department;
}
}
其中,Employee类包含了三个成员变量,分别为name,age和department。其中,name和age为原始类型,而department是一个引用类型,表示一个部门对象。在堆内存中,该对象的结构如下所示:
------------------------------
| Mark Word(8字节) |
------------------------------
| Klass Pointer(4字节) |
------------------------------
| name(4字节) |
------------------------------
| age(4字节) |
------------------------------
| department(4字节) |
------------------------------
在该例中,该对象的大小为24字节,其中对象头包括Mark Word和Klass Pointer,总共占用12字节,实例数据大小为12字节。
- 对象数组变量
对于下面的代码片段:
public class Department {
private String name;
private Employee[] employees;
public Department(String name, Employee[] employees) {
this.name = name;
this.employees = employees;
}
}
其中,Department类包含了两个成员变量,分别为name和employees。其中,name为原始类型,employees是一个Employee类型的对象数组。在堆内存中,该对象的结构如下所示:
------------------------------
| Mark Word(8字节) |
------------------------------
| Klass Pointer(4字节) |
------------------------------
| name(4字节) |
------------------------------
| employees(4字节) |
------------------------------
在该例中,该对象的大小为24字节,其中对象头包括Mark Word和Klass Pointer,总共占用12字节,实例数据大小为12字节。注意,这里的employees成员变量是一个指向Employee对象数组的引用,并不包括数组本身的大小。对于数组本身的大小,需要在Mark Word中使用数组长度来存储。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈java object对象在heap中的结构 - Python技术站