深入讲解Java的对象头与对象组成
在Java中,每个对象都有一个对象头,用来存储对象的元数据信息,同时Java对象也由对象头和实例数据两个部分组成。了解Java对象的组成可以帮助我们更好地理解Java的内存模型。
Java对象的组成
Java对象是由对象头和实例数据两个部分组成的。在64位JVM中,对象头占用16Byte,实例数据大小不定,但至少为8Byte(指向对象的指针)。
对象头
Java对象头包含以下几个信息:
- Mark Word(标记字):用来表示对象的锁信息、垃圾回收标记状态等信息。
- Class Pointer(类型指针):指向对象对应的类元数据信息。
- Array length(数组长度):仅用于数组对象的对象头,表示数组的长度。
Java对象的Mark Word是Java对象头中最重要的部分,存储了对象的状态信息。例如,对象是否处于锁定状态,对象是否被递归地访问过等等。
实例数据
实例数据存储了对象的各个属性的值,可以是基本类型或者对象引用。实例数据是对象中最重要的部分,占用的内存大小不定,具体由类定义时所使用的变量类型和数量决定。
示例说明
示例1
下面是一个Person类的定义。该类用来表示一个人的信息,包括名字和年龄。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person类的实例数据由name和age两个属性组成,name属性是一个String类型的引用,age属性是一个int类型的值。在64位JVM中,Person对象的实例数据占用的大小为16Byte(String引用8B,int值4B,内存对齐需要填充4B)。
Person对象的对象头占用的大小为16Byte(Mark Word 8B,类型指针8B)。因此,整个Person对象的大小为32Byte。
示例2
下面是一个Student类的定义。该类继承自Person类,同时还有一个score属性,用来表示学生的成绩。
public class Student extends Person {
private int score;
public Student(String name, int age, int score) {
super(name, age);
this.score = score;
}
}
Student类的实例数据由name、age和score三个属性组成,name和age属性都继承自Person类,score属性是一个int类型的值。在64位JVM中,Student对象的实例数据占用的大小为20Byte(Person对象实例数据大小16B,int值占用4B)。
Student对象的对象头占用的大小为16Byte(Mark Word 8B,类型指针8B)。因此,整个Student对象的大小为36Byte。
总结
Java对象由对象头和实例数据两个部分组成。对象头存储了对象的元数据信息,包括标记字、类型指针、数组长度等信息。实例数据存储了对象的各个属性的值,可以是基本类型或者对象引用。了解Java对象的组成可以帮助我们更好地理解Java的内存模型,同时也可以帮助我们设计更优雅、更高效的Java程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入讲解Java的对象头与对象组成 - Python技术站