对象的内存大小(以字节为单位)

时间:2019-05-12 15:04:54

标签: java

例如,如果我有一个对象...

String city = "Chicago"

我有数百万。假设我拿了那百万个对象的字节,

byte[] cityByte = "Chicago".getBytes()

字节会占用更少的内存空间吗?

编辑:更深入:

我有几个com.microsoft.azure.servicebus.Message对象。我打算使用来自Apache Commons Lang的SerializationUtils来获取每个对象的字节数组并将其存储在List中。

我当时想,如果我将100万个Message对象存储在一个List中,那可能会引起问题。但是,如果我将相同的百万个对象作为字节数组存储在列表中,那么我将剩下更多的内存,因此我可以做其他事情。因此是问题。

1 个答案:

答案 0 :(得分:3)

我使用JOL 1确定运行时内存中对象的实际大小:

import org.openjdk.jol.info.GraphLayout;

public class MainClass {

    public static void main(String[] args) {

        String city = "Chicago";

        byte[] cityByte = "Chicago".getBytes();

        System.out.println(GraphLayout.parseInstance(city).toPrintable());
        System.out.println(GraphLayout.parseInstance(cityByte).toPrintable());
    }
}

输出:

java.lang.String@4d7e1886d object externals:
          ADDRESS       SIZE TYPE             PATH                           VALUE
        76ac826d8         24 java.lang.String                                (object)
        76ac826f0         32 [C               .value                         [C, h, i, c, a, g, o]


[B@3caeaf62d object externals:
          ADDRESS       SIZE TYPE PATH                           VALUE
        76ac82738         24 [B                                  [67, 104, 105, 99, 97, 103, 111]

结论:“字符串” 32 字节与“字节[]” 24 字节

P.S。结果可能因JVM版本和选项而异。在您的环境中尝试相同的方法。在jdk_1.8.0_161 Mac OS 10.14上运行

JOL