考虑以下一行程序:
public static void main(String[] args) throws Exception {
// 134217728 * 2 bytes / 1024 / 1024 = 256M
char[] array = new char[134217728];
}JVM需要多少内存来分配这个256 m字符数组?
原来答案是-Xmx384m。现在让我们试试512米字符数组..。
// 268435456 * 2 bytes / 1024 / 1024 = 512M
char[] array = new char[268435456]; 答案似乎是-Xmx769m。
在运行过程中,对于一个大小为m的字符数组,只需几个例子。jvm需要至少150万兆的内存来分配数组。这似乎很多,有人能解释一下这里发生了什么吗?
发布于 2015-03-13 18:59:08
我相信你在观察Oracle JVM分配内存的方式。
特别是,整个数组必须符合一个“一代”。默认情况下,旧代的大小是新一代的两倍--这意味着每添加一台3MB,就只能在老一代中获得2MB的额外空间。如果更改比率,则可以将char数组分配到较小的总大小中。例如,这适用于512 me数组:
java -Xmx530M -XX:NewRatio=50 Test顺便说一句,您可以看到字节数组的相同效果,然后您不需要担心将数组的长度增加一倍才能得到字节大小。(类引用和长度有较小的常量开销,但很明显,这是微不足道的。)
发布于 2015-03-13 18:59:35
环境本身需要一点空间,就像在一个注释中一样,它取决于使用的JVM和编译器(OpenJdk或Oracle 6/7/8)。总而言之,它应该以大小为导向: Character.SIZE * array.length。
https://stackoverflow.com/questions/29039821
复制相似问题