Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象的内存大小(字节)_Java - Fatal编程技术网

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已经通过使相同的字符串共享备用字节或字符数组,对在多个垃圾收集周期中幸存的字符串进行了大量优化。你天真的优化尝试可能只会消耗更多的内存,而不是更少。你真的遇到内存问题了吗?现在大多数机器都能处理数百万个物体而不出一身冷汗。