jvm - 对象在内存中的布局 - 面试宝典
【摘要】 JVM中的对象在内存中的布局主要包括对象头、实例数据和对齐填充三个部分。对象头:对象头包括两部分内容:Mark Word(标记字段):用于存储对象的运行时数据,如对象的哈希码、GC信息等。Class Metadata Address(类型指针):指向对象的类元数据,用于确定对象属于哪个类。实例数据:实例数据是对象的实际数据部分,包含定义在类中的各个字段的值。对齐填充:由于JVM要求对象的起始...
JVM中的对象在内存中的布局主要包括对象头、实例数据和对齐填充三个部分。
- 对象头:对象头包括两部分内容:
- Mark Word(标记字段):用于存储对象的运行时数据,如对象的哈希码、GC信息等。
- Class Metadata Address(类型指针):指向对象的类元数据,用于确定对象属于哪个类。
- 实例数据:实例数据是对象的实际数据部分,包含定义在类中的各个字段的值。
- 对齐填充:由于JVM要求对象的起始地址必须是8字节的整数倍,所以在实例数据后面可能会有一些填充字节,保证对象的总大小是8字节的整数倍。 下面是一个示例代码,展示了一个简单的Java类的对象在内存中的布局:
javaCopy codepublic class Student {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public void printInfo() {
System.out.println("Student ID: " + id);
System.out.println("Student Name: " + name);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student(1, "John");
student.printInfo();
}
}
在上述代码中,创建了一个Student
对象,并调用了printInfo
方法打印学生的信息。这个Student
对象在内存中的布局如下:
plaintextCopy code对象头(16字节):Mark Word(8字节) + Class Metadata Address(8字节)
实例数据(8字节):id(4字节) + name(4字节)
对齐填充(0字节)
需要注意的是,具体的对象布局可能会因为不同的JVM实现、JVM参数配置等而有所差异,上述示例只是一个简单的演示。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)