java计算一个实例对象占用空间大小的方法分享

打印 上一主题 下一主题

主题 788|帖子 788|积分 2364

转自:http://www.java265.com/JavaJingYan/202110/16349927561557.html
下文笔者将讲述一个java对象占用空间大小的方法分享,如下所示:
对象头

一个对象头部至少有两个WORD
如果对象是数组,则需要三个WORD,如下:

  • 对象的HashCode,锁信息
  • 对象类型数据的指针
  • 数组的长度(对象为数组)
计算规则

在Java代码中,任何对象都是8字节对齐
属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放
例:
  1. public class Test {
  2.   byte a;
  3.   int b;
  4.   boolean c;
  5.   long d;
  6.   Object e;
  7. }
复制代码
  1. 当一个对象的属性按照以上顺序存储,
  2. 则其占用空间为
  3.   head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40
  4. 如果按照这个规则得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32
  5. 可以解决很多空间
复制代码
在涉及继承关系时, 则我们会按照一个基本的原则, 先放父类中的成员 然后再放入子类中的成员 例:
  1. class A {
  2.   long a;
  3.   int b;
  4.   int c;
  5. }
  6. class B extends A {
  7.   long d;
  8. }
复制代码
按照以上规则的存储空间大小为:
head(8) + a(8) + b(4) + c(4) + d(8) = 32
当父类中的属性不够八个字节时,
父类中最后一个成员与子类的第一个成员的间隔如果不够4个字节,
此时需要扩展到4个字节的基本单位
例:
  1. class A {
  2.   byte a;
  3. }
  4. class B extends A {
  5.   byte b;
  6. }
复制代码
占用大小为:
head(8) + a(1) + padding(3) + b(1) + padding(3) = 16
-------------------------------------------------------
当子类的第一个成员是double或long
且父类未用完8个字节
JVM会破坏规将较小的数据填充到该空间
例:
  1. class A {
  2.   byte a;
  3. }
  4. class B extends A {
  5.   long b;
  6.   short c;
  7.   byte d;
  8. }
复制代码
按照以上的占用空间大小为:
head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表