例如,如果我有一个对象...
String city = "Chicago"
我有数百万。假设我拿了那百万个对象的字节,
byte[] cityByte = "Chicago".getBytes()
字节会占用更少的内存空间吗?
编辑:更深入:
我有几个com.microsoft.azure.servicebus.Message对象。我打算使用来自Apache Commons Lang的SerializationUtils来获取每个对象的字节数组并将其存储在List中。
我当时想,如果我将100万个Message对象存储在一个List中,那可能会引起问题。但是,如果我将相同的百万个对象作为字节数组存储在列表中,那么我将剩下更多的内存,因此我可以做其他事情。因此是问题。
答案 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上运行