为什么 Point 占用的内存比 Integer 少

2022-09-04 01:39:01

我通过检查对象的字节数组使用ByteArrayOutputStream的时间来测量对象的大小。在做:

System.out.println(Utils.getObjectSize(new Integer(123123)));
System.out.println(Utils.getObjectSize(new Point(123, 123)));

他们返回81和51。

我相信Point由两个原语组成,但这似乎不是原因。

Utils.getObjectSize 的代码 I:

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
objectStream.writeObject(object);
objectStream.close();
return byteStream.toByteArray().length;

编辑:

我表达错了。我真的很想知道为什么它们在流中需要更多的尺寸。


答案 1

从字符串开始,并出现在 的序列化结果中。这应该提示为什么序列化大小与对象的成员不是很相关。java.lang.Integerjava.lang.NumbervalueInteger

下面列出了生成的字节数组的一些内容:http://ideone.com/ragKZ

import java.awt.Point;
import java.io.*;

class Test {

    public static byte[] getBytes(Object object) throws IOException {
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
        objectStream.writeObject(object);
        objectStream.close();
        return byteStream.toByteArray(); 
    }

    public static void main(String[] args) throws IOException {

        byte[] iBytes = getBytes(new Integer(123123));
        System.out.println(new String(iBytes,  8, 17)); // "java.lang.Integer"
        System.out.println(new String(iBytes, 39,  5)); // "value"
        System.out.println(new String(iBytes, 48, 16)); // "java.lang.Number"
        // ...

        byte[] pBytes = getBytes(new Point(123, 123));
        System.out.println(new String(pBytes, 8, 14));  // "java.awt.Point"
        // ...
    }
}

答案 2

您查找对象大小的方法实际上根本不会测量它们在内存中占用的空间。

Point实际上会比(对于4字节对齐的JVM;8字节对齐的JVM,它们将相同)占用更多的内存 - 它只是碰巧序列化为较小的大小,可能是由于继承层次结构。Integer