2017-08-29 42 views
5

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.

+0

Kullanılmış bellek boyutlarını nasıl hesapladınız? –

+0

-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ı –

+0

Kodunuz tarafından gereken bellek demek istedim .... –

cevap

6

Bu durumun Humongous Allocations nedeniyle gerçekleştiğinden eminim.
Bu seçeneği eklerseniz

XX: + PrintAdaptiveSizePolicy

Eğer ayırmaları çoğu% 50 ne de hatta% 100 ne uyan 1.048.592 bayt olduğunu görmek mümkün olacak Tek G1 bölgesi (çıktıda görüldüğü gibi 1024K = 1048576 bayttır). Her dizinin en az iki bölge kapladığı anlamına gelir. Humojen bir tahsis olduğu için ikinci bölgedeki boş alanın çoğu kullanılamaz. Bu hızlı bir şekilde aşırı yığın parçalanmasına neden olarak daha fazla tahsisat yapılmasına olanak vermez.

1

@yegodm ile katılıyorum. Çözüm, önceki Humongous nesnelerinin artık Nümuz olmadığından ve normal ayırma yolunu izleyeceğinden emin olmak için -XX: G1HeapRegionSize ile Yığın bölgesini arttırmaktır. Daha fazla bilgi için bkz. Humusuz nesne ataması hakkında 1

İlgili konular