家里有多少内存,JVM需要分配一个字符数组?

use*_*921 0 java arrays jvm out-of-memory

考虑遵循1行计划:

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

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

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

// 268435456 * 2 bytes / 1024 / 1024 = 512M
char[] array = new char[268435456]; 
Run Code Online (Sandbox Code Playgroud)

答案似乎是-Xmx769m.

在运行一些大小为m的字符数组的例子.jvm需要至少1.5m兆字节的内存来分配阵列.这似乎很多,谁能解释这里发生了什么?

Jon*_*eet 6

我相信你正在观察Oracle JVM分配内存的方式.

特别是,整个阵列必须适合一代"一代".默认情况下,旧一代的大小是新一代的两倍 - 这意味着每增加3MB,你只需要在老一代中获得2MB的额外空间.如果更改比率,则可以以较小的总大小分配char数组.例如,这适用于我的512MB阵列:

java -Xmx530M -XX:NewRatio=50 Test
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你看到与字节数组完全相同的效果,然后你不必担心加倍数组的长度来获得字节大小.(对于类引用和长度来说,有一个小的不变开销,但显然这很简单.)