JAVA对象的内存布局分析

分析工具

可通过JOL工具进行分析

依赖

testImplementation 'org.openjdk.jol:jol-core:0.16'

示例代码 

import org.junit.jupiter.api.Test;

  import org.openjdk.jol.info.ClassLayout;

  

  public class ObjectLayoutTest {

  

    @Test

    void testLayout(){

        System.out.println( ClassLayout.parseInstance(new ObjectA()).toPrintable() );

        System.out.println("***********************************************************");

        System.out.println( ClassLayout.parseInstance(new ObjectA[]{new ObjectA()}).toPrintable() );

    }

  

    public static class ObjectA{

        private long a;

    }

}

结果

com.xxx.sprbegin.ObjectLayoutTest$ObjectA object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4        (object header: class)    0xf801ef34
 12   4        (alignment/padding gap)   
 16   8   long ObjectA.a                 0
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total

***********************************************************
[Lcom.xxx.sprbegin.ObjectLayoutTest$ObjectA; object internals:
OFF  SZ                                            TYPE DESCRIPTION                            VALUE
  0   8                                                 (object header: mark)                  0x0000000000000001 (non-biasable; age: 0)
  8   4                                                 (object header: class)                 0xf802ef3a
 12   4                                                 (array length)                         1
 12   4                                                 (alignment/padding gap)                
 16   4   com.wywtime.sprbegin.ObjectLayoutTest$ObjectA ObjectLayoutTest$ObjectA;.<elements>   N/A
 20   4                                                 (object alignment gap)                 
Instance size: 24 bytes
Space losses: 4 bytes internal + 4 bytes external = 8 bytes total

布局分析

JAVA对象的内存布局大体分三块内容:

对象头

其主要包括两部分数据:Mark Word、Class对象指针。数组的话会多一个四字节的array length。 Class对象指针默认开启指针压缩,占四个字节。

实例数据

用于存放该对象的实例数据,如果是对象,存在是引用地址。

内存填充

64位的HotSpot要求Java对象地址按8字节对齐,即每个对象所占内存的字节数必须是8字节的整数倍。因此Java对象需要通过内存填充来满足对齐要求

示例图

https://pic3.zhimg.com/80/v2-961b928cf04da5ce629ee08fd767191e_720w.jpg

MarkWord

https://pic2.zhimg.com/80/v2-773175d3d55668daf774d1b0fd0427b1_720w.jpg

参考文章

https://zhuanlan.zhihu.com/p/151856103

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值