我的測試代碼:G1GC內存不足太早
int SIZE = 1900;
int[][] array = new int[SIZE][];
for (int i = 0; i < SIZE; i++) {
array[i] = new int[1024 * 1024/4]; // 1MB
Thread.sleep(10);
if (i % 100 == 0 && i != 0) {
System.out.println(i + "Mb added");
}
}
我帶參數運行它在Java 8 -Xmx2048m -XX:+UseG1GC -XX:+PrintGCDetails
它失敗,內存不足時,只有1G被消耗。
Heap
garbage-first heap total 2097152K, used 1048100K [0x0000000080000000, 0x0000000080104000, 0x0000000100000000)
region size 1024K, 1 young (1024K), 0 survivors (0K)
Metaspace used 3273K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 358K, capacity 388K, committed 512K, reserved 1048576K
我看到G1分配的大小是2G,我想JVM試圖分配更多,並與OOM失敗。但是,如果內存的一半是免費的,它爲什麼要分配更多?
與UseConcMarkSweepGC
它工作正常,數組完全填充。
您是如何計算使用內存大小的? –
-XX:+ PrintGCDetails打印堆狀態,如您在我的問題總共2097152K,使用1048100K'中看到的那樣。我檢查了Windows和Linux。行爲是一樣的 –
我的意思是你的代碼所需的內存.... –