繁体   English   中英

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 兆字节的内存来分配数组。 这似乎很多,谁能解释一下这里发生了什么?

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

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

java -Xmx530M -XX:NewRatio=50 Test

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM