jvm - 对象在内存中的布局 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/02 09:42:36 2023/08/02
【摘要】 JVM中的对象在内存中的布局主要包括对象头、实例数据和对齐填充三个部分。对象头:对象头包括两部分内容:Mark Word(标记字段):用于存储对象的运行时数据,如对象的哈希码、GC信息等。Class Metadata Address(类型指针):指向对象的类元数据,用于确定对象属于哪个类。实例数据:实例数据是对象的实际数据部分,包含定义在类中的各个字段的值。对齐填充:由于JVM要求对象的起始...

JVM中的对象在内存中的布局主要包括对象头、实例数据和对齐填充三个部分。

  1. 对象头:对象头包括两部分内容:
  • Mark Word(标记字段):用于存储对象的运行时数据,如对象的哈希码、GC信息等。
  • Class Metadata Address(类型指针):指向对象的类元数据,用于确定对象属于哪个类。
  1. 实例数据:实例数据是对象的实际数据部分,包含定义在类中的各个字段的值。
  2. 对齐填充:由于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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。