Testim kodu:G1GC OutOfMemory çok erken
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");
}
}
Ben -Xmx2048m -XX:+UseG1GC -XX:+PrintGCDetails
java 8'de argümanlarla başlatın Ve ancak 1G tüketilen zaman OutOfMemory başarısız olur.
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
Ben G1 ayrılan boyut 2G olduğunu görüyoruz ve ben JVM daha ayırmaya çalışırken ve OOM ile başarısız olduğunu varsayalım. Ama hafızanın yarısı boşsa neden daha fazla tahsis etmeye çalışıyor?
UseConcMarkSweepGC
ile iyi çalışıyor ve dizi tamamen dolu.
Kullanılmış bellek boyutlarını nasıl hesapladınız? –
-XX: + PrintGCDetails, "2095152K, 1048100K kullanılan toplam" sorgumda gördüğünüz gibi Yığın durumunu yazdırıyor. Windows ve Linux'ta da kontrol ettim. Davranış aynı –
Kodunuz tarafından gereken bellek demek istedim .... –