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兆字节的内存来分配阵列.这似乎很多,谁能解释这里发生了什么?
我相信你正在观察Oracle JVM分配内存的方式.
特别是,整个阵列必须适合一代"一代".默认情况下,旧一代的大小是新一代的两倍 - 这意味着每增加3MB,你只需要在老一代中获得2MB的额外空间.如果更改比率,则可以以较小的总大小分配char数组.例如,这适用于我的512MB阵列:
java -Xmx530M -XX:NewRatio=50 Test
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你看到与字节数组完全相同的效果,然后你不必担心加倍数组的长度来获得字节大小.(对于类引用和长度来说,有一个小的不变开销,但显然这很简单.)
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |