Java基础——在Java中创建一个Object对象会占用多少内存

Object obj = new Object();

      一个看似非常简单的问题,在Java中用以上代码创建一个Object对象,这个Object对象会占用多少内存。如果不说答案,有多少小伙伴能答出来,并且有多少小伙伴能说明其中原因?

答案

64位虚拟机是16个字节即16byte(128bit)

32位虚拟机是8个字节即8byte(64bit)

分析

      首先通过new关键字进行对象的创建是在Java运行时进行的,一般情况(不考虑栈上分配等特殊情况)下JVM(Java虚拟机)会在它的运行时数据区的Java堆区创建。Java对象在内存中的布局可分为:对象头、实例数据和对齐填充。对象头中包含MarkWord、类型指针和数组长度。

      64位机下Object对象的MarkWord占用8byte,类型指针占用8byte,因为不是数组,而且是空对象,所以对象头中的数组长度和实例数据不会占用内存。因此,得出8byte(MarkWord)+ 8byte(类型指针)= 16byte的结论。

      64位机下如果开启指针压缩,那么Object对象的对象头中的类型指针只会占用4byte,那么这种情况下不就是8 + 4 = 12byte了吗?其实不然,因为还有对齐填充:

在64bit的虚拟机中,《虚拟机规范》中规定了:为了方便内存的单元读取、寻址、分配,Java对象的总大小必须要为8的整数倍,所以当一个对象的对象头+实例数据大小不为8的整数倍时,此刻就会出现对齐填充部分,将对象大小补齐为8的整数倍

      因此,最终结果是8byte(MarkWord)+ 4byte(类型指针)+ 4byte(对齐填充)= 16byte。

      32位机下Object对象的MarkWord占用4byte,类型指针占用4byte,因为32位机不存在指针压缩技术,因此,得出4byte(MarkWord)+ 4byte(类型指针)= 8byte。

小结

      分析结束,你看懂了吗?看似简单的问题背后涵盖了JVM对象内存布局的基础知识。其实往往很多平时开发过程中的疑惑,当你搞懂底层概念之后,答案也自然而然的浮现在你眼前了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值