仅包含基元类型的Java对象的大小

仅包含基元类型的Java对象的大小,java,object,sizeof,primitive,unsafe,Java,Object,Sizeof,Primitive,Unsafe,我有一个仅由以下基本类型组成的类: public class Test{ private int a1; //size of int =4 private long a2; //size of long = 8 private double a3[]; //size of double =8 } 此外,我有一个这样的类对象: Test test= new Test(1,3,new double[] {0.1, 0.2, 0.3, 0.4}); 我希望有一个函数可以找到这个对象的大小,在这

我有一个仅由以下基本类型组成的类:

public class Test{

private int a1; //size of int =4
private long a2; //size of long = 8
private double a3[]; //size of double =8

}
此外,我有一个这样的类对象:

Test test= new Test(1,3,new double[] {0.1, 0.2, 0.3, 0.4});

我希望有一个函数可以找到这个对象的大小,在这种情况下,它将返回4+8+4*8=44。

如果我正确理解了这个问题,那么您可以自己轻松实现它,但现在我们开始:

public class Test {
    private int a1;
    private long a2;
    private double a3[];

    public Test(final int a1, final long a2, final double[] a3) {
        this.a1 = a1;
        this.a2 = a2;
        this.a3 = a3;
    }

    public int getSize() {
        return 4 + 8 + (a3.length * 8);
    }
}
还有几点注意:

  • 不要使用
    Test
    作为类名,您应该使用类似
    SizeTest
    之类的东西,但如果您决定对其进行单元测试或诸如此类的话,简单的测试最终会造成严重破坏
  • 为变量指定有意义的名称。如果我有机会的话,我会这么做的,但是我真的不能从现在的名字中得到任何东西

如果您正在寻找一个泛型函数,那么事情会变得更加困难,在这种情况下,您将寻找具有以下签名的方法:
SizeTester.getSize(Object),这仍然是可行的,但是您需要使用反射然后才能获得关于字段的信息,并且您应该只在绝对必要的情况下使用它。

我对对象的总大小不感兴趣,而只对所使用的基本变量的总大小感兴趣,如给出的示例所示。然后。。。用于64位JVM上的大小;32位JVM使用4字节内存对齐而不是8字节内存对齐,因此int和float将占用4字节而不是8字节(实际上,您的对象占用的字节数超过44个;假设是32位HotSpot VM,则您的
double[]
实际上是对数组对象的一个4字节引用,数组对象有一个8字节的头,一个4字节的长度字段,然后是四个双精度对象,所以60可能是一个更准确的数字。)谢谢你的回答,但显然我正在搜索一个通用函数。最后,我使用hashMap手动计算大小,其中存储了每种类型以及数组的不同大小。再次非常感谢。