Home much memory 请问JVM需要分配一个字符数组吗?

Home much memory does the JVM need to allocate a character array?

考虑以下 1 行程序:

public static void main(String[] args) throws Exception {
    // 134217728 * 2 bytes / 1024 / 1024 = 256M
    char[] array = new char[134217728]; 
}

JVM需要多少内存才能分配这个256M的字符数组?

原来答案是-Xmx384m。现在让我们试试 512M 字符数组...

// 268435456 * 2 bytes / 1024 / 1024 = 512M
char[] array = new char[268435456]; 

答案似乎是 -Xmx769m。

在 运行 中,虽然有几个大小为 m 的字符数组的示例。 jvm 至少需要 1.5m 兆字节的内存来分配数组。这似乎很多,谁能解释一下这里发生了什么?

我相信你在观察 the way that the Oracle JVM allocates memory

特别是,整个数组必须适合一个 "generation"。默认情况下,老年代的大小是新生代的两倍——这意味着你总共添加 3MB,你只能在老年代额外获得 2MB space。如果更改比率,则可以分配较小的总大小的 char 数组。例如,这适用于我的 512MB 阵列:

java -Xmx530M -XX:NewRatio=50 Test

顺便说一句,您会看到与字节数组完全相同的效果,然后您无需担心将数组的长度加倍以获得以字节为单位的大小。 (class 引用和长度的开销很小,但显然这是微不足道的。)

环境本身需要一点点 space,正如一条评论中所述,它取决于所使用的 JVM 和编译器(OpenJdk 或 Oracle,java 6/7/8)。总而言之,它应该以大小为导向:Character.SIZE * array.length.