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

时间:2015-03-13 18:51:06

标签: 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]; 
}

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

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

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

答案似乎是-Xmx769m。

通过运行一些大小为m的字符数组的示例。 jvm需要至少1.5m兆字节的内存来分配阵列。这似乎很多,任何人都可以解释这里发生了什么?

2 个答案:

答案 0 :(得分:6)

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

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

java -Xmx530M -XX:NewRatio=50 Test

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

答案 1 :(得分:0)

环境需要一点空间,因为在一个注释中它取决于使用的JVM和编译器(OpenJdk或Oracle,java 6/7/8)。总而言之,它应该根据大小来定位:Character.SIZE * array.length。