Java的对象组成简介

一. 问题背景

遇到一个面试题“对象的内存布局”,其中涉及对象的组成。今天了解一下Java对象组成。JVM规范一个对象由什么组成,但市面上有很多实现JVM规范的JVM虚拟机,此处以sun公司的HotSpot虚拟机为例子

此笔记仅供自己参考,如有错误请指正

参考自:Java的对象头和对象组成详解

二. 对象的组成

对象的组成有3个部分:对象头实例数据对齐填充字节。其中对象头包含3个部分:Mark Word指向类的指针数组长度如果当前对象不是数组则没有此部分

2.1对象头Object Header

对象头包含3个部分:Mark Word(对象自身运行时的数据);指向类的指针数组长度如果当前对象不是数组则没有此部分

2.1.1 Mark Word

如果jvm是32位,则Mark Word是32bit;如果64位,则Mark Word是64bit。Mark Word结构如下:

在这里插入图片描述
从上图可以看到,Mark Work存储的是对象自身运行时的数据,比如:锁标志位;是否偏向锁;GC分代年龄;对象的hashCode;获取到该锁的线程的线程ID;偏向时间戳(Epoch)等等。

注:对象头有关锁标志位的信息涉及到并发编程原理,目前暂未详细了解,此处不必纠结,日后再作深入学习。

2.1.2 Klass Word(指向类的指针)

如果jvm是32bit,则Klass Word是32bit;如果jvm是64bit,则Klass Word是64bit。
Java对象存放在堆中,但其类信息存放在方法区中,所以Klass word指向该对象的类信息。

2.1.3 数组长度array length

如果当前对象是数组,才有此数组长度字段。
如果jvm是32bit,则数组长度是32bit;如果jvm是64bit,则数组长度是64bit

2.2 实例数据Instance Data

对象的实例数据就是对象在java代码中的属性(包括父类属性以及自己的属性)和值。

2.3 对齐填充字节padding

因为jvm要求Java对象占用内存的大小是8byte的倍数,因此需要把对象的大小补齐至8byte倍数。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值