Java对象内存布局

1 场景

此文主要分析:

在java中new Object()占用多少字节?在内存中的布局是怎么的?

基于版本:jdk1.8

2 内存布局图

jdk8中,Java对象的内存布局如下图:

image.png

其中需注意:

(1)数组对象中才有数组长度这一块内存区

(2)所有的对象大小,必须是8字节整数倍。因此有个内存补齐Padding区,当Java对象的内存不够8字节的整数倍,此Padding区进行补齐。

3 代码验证

验证环境:
64位操作系统+JDK1.8

3.1 maven依赖
<dependency>
	<groupId>org.openjdk.jol</groupId>
	<artifactId>jol-core</artifactId>
	<version>0.14</version>
</dependency>
3.2 代码示例
import org.openjdk.jol.info.ClassLayout;

public class ObjectContext {
    public static void main(String[] args) {
        Object o = new Object();
        ClassLayout layout = ClassLayout.parseInstance(o);
        System.out.println(layout.toPrintable());
    }
}
3.3 输出内容
java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
3.4 分析

输出日志中显示:Instance size: 16 bytes,即new Object()占用16个字节。
其中,输出
loss due to the next object alignment

Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
表示内存补齐Padding,占用4个字节

其中:

类型字节
对象头MarkWord8
类型指针4
对象内容0
内存补齐Padding4
3.5 补充

启动jvm参数中,禁用指针压缩,加上如下参数:

-XX:-UseCompressedOops

再次执行刚出的java代码,输出日志如下:

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           00 1c 7f 1c (00000000 00011100 01111111 00011100) (478092288)
     12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

虽然结果也是16个字节,但是根据:
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
内存补齐Padding,占用0个字节。
即占用分布如下:

类型字节
对象头MarkWord8
类型指针8
对象内容0
内存补齐Padding0

4 问题解答

4.1 new空对象占用多少字节

new Object()占用多少内存字节?

当前操作系统基本都是64位,这里参照**《2 内存布局图》**,来分析64位操作系统中需要多少字节。

操作系统对象类型指针压缩明细总字节数
64位普通对象开启MarkWord:8字节
类型指针:4字节
对象内容:0字节
内存补齐:4字节
16字节
64位普通对象关闭MarkWord:8字节
类型指针:8字节
对象内容:0字节
内存补齐:0字节
16字节
64位数组对象开启MarkWord:8字节
类型指针:4字节
数组长度:4字节
对象内容:0字节
内存补齐:0字节
16字节
64位数组对象关闭MarkWord:8字节
类型指针:8字节
数组长度:4字节
对象内容:0字节
内存补齐:4字节
24字节
4.2 Java对象在内存中的布局

见**《2 内存布局图》**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值