java计算一个实例对象占用空间大小的方法分享
  JNAqSH1ms97q 2023年11月01日 55 0

转自:http://www.java265.com/JavaJingYan/202110/16349927561557.html

下文笔者将讲述一个java对象占用空间大小的方法分享,如下所示:

对象头

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

  1. 对象的HashCode,锁信息
  2. 对象类型数据的指针
  3. 数组的长度(对象为数组)

计算规则

在Java代码中,任何对象都是8字节对齐
属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放
例:

public class Test {
  byte a; int b; boolean c; long d; Object e; }
当一个对象的属性按照以上顺序存储,
则其占用空间为
  head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40
 如果按照这个规则得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32
 可以解决很多空间

在涉及继承关系时, 则我们会按照一个基本的原则, 先放父类中的成员 然后再放入子类中的成员 例:

class A {
  long a; int b; int c; } class B extends A { long d; }

按照以上规则的存储空间大小为:

head(8) + a(8) + b(4) + c(4) + d(8) = 32
当父类中的属性不够八个字节时,
父类中最后一个成员与子类的第一个成员的间隔如果不够4个字节,
此时需要扩展到4个字节的基本单位
例:

class A {
  byte a; } class B extends A { byte b; }

占用大小为:

head(8) + a(1) + padding(3) + b(1) + padding(3) = 16
-------------------------------------------------------
当子类的第一个成员是double或long
且父类未用完8个字节
JVM会破坏规将较小的数据填充到该空间
例:

class A {
  byte a; } class B extends A { long b; short c; byte d; }

按照以上的占用空间大小为:

head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   110   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
JNAqSH1ms97q