Java 对象的内存大小(字节)
例如,如果我有一个对象Java 对象的内存大小(字节),java,Java,例如,如果我有一个对象 String city = "Chicago" 我有数百万个。假设我取那一百万个对象的字节 byte[] cityByte = "Chicago".getBytes() 字节会占用更少的内存空间吗 编辑:更深入: 我有几个东西。我打算使用ApacheCommonsLang获取每个对象的字节数组,并将其存储在列表中 我在想,如果我在一个列表中存储100万个消息对象,那可能会引起问题。但是如果我在一个列表中存储与字节数组相同的一百万个对象,我将有更多的内存,这样我可以做其
String city = "Chicago"
我有数百万个。假设我取那一百万个对象的字节
byte[] cityByte = "Chicago".getBytes()
字节会占用更少的内存空间吗
编辑:更深入:
我有几个东西。我打算使用ApacheCommonsLang获取每个对象的字节数组,并将其存储在列表中
我在想,如果我在一个列表中存储100万个消息对象,那可能会引起问题。但是如果我在一个列表中存储与字节数组相同的一百万个对象,我将有更多的内存,这样我可以做其他事情。这就是问题所在。我在运行时使用JOL来确定内存中对象的实际大小:
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字节
注意:结果可能因JVM版本和选项而异。在您的环境中尝试相同的方法。在jdk_1.8.0_161 Mac OS 10.14上运行
这取决于您的JVM、JVM选项和平台字符编码。我想说,这个解决方案可能不是解决您问题的最佳方案,但您尚未暴露您的实际问题。请吧。你想达到什么目标?为什么内存中有数百万个字符串?另外,您是否意识到并非所有对象都有getBytes()方法?如果您有许多类似的字符串,您还可以使用JVM字符串池来节省内存。OK。因此,您的问题与String.getBytes()完全无关,而是与序列化对象的大小和对象的大小有关。相反,序列化对象可能不会保存任何内容。这仍然不能解释你在记忆中想要实现什么。消息通常意味着要发送、处理或存储,但不能保存在内存中。不管怎样,你为什么认为你会有记忆问题呢?不要过早地进行优化。在最近的版本中,Java已经通过使相同的字符串共享备用字节或字符数组,对在多个垃圾收集周期中幸存的字符串进行了大量优化。你天真的优化尝试可能只会消耗更多的内存,而不是更少。你真的遇到内存问题了吗?现在大多数机器都能处理数百万个物体而不出一身冷汗。