2017-08-29 16 views
5

मेरे परीक्षण कोड:G1GC OutOfMemory बहुत जल्दी

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"); 
    } 
} 

मैं जावा 8 -Xmx2048m -XX:+UseG1GC -XX:+PrintGCDetails

में तर्क के साथ इसे लॉन्च और जब केवल 1G सेवन किया जाता है यह OutOfMemory साथ विफल रहता है।

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 आवंटित आकार 2 जी और मुझे लगता है कि JVM अधिक हिस्सा आवंटित करने की कोशिश कर रहा है और यह OOM के साथ विफल हो जाता है। लेकिन यदि स्मृति का आधा मुक्त है तो यह और अधिक आवंटित करने का प्रयास क्यों कर रहा है?

UseConcMarkSweepGC के साथ यह ठीक काम कर रहा है और सरणी पूरी तरह से भर गई थी।

+0

आपने उपयोग किए गए मेमोरी आकारों की गणना कैसे की? –

+0

-XX: + PrintGCDetails हीप स्थिति प्रिंट करता है जैसा कि आप मेरे प्रश्न 'कुल 20 9 7152 के, 1048100K' का उपयोग कर सकते हैं। मैंने विंडोज और लिनक्स दोनों की जांच की। व्यवहार वही है –

+0

मेरा मतलब आपके कोड द्वारा आवश्यक मेमोरी है .... –

उत्तर

6

मुझे यकीन है कि यह Humongous Allocations के कारण होता है।
आप इस विकल्प को जोड़ देते हैं तो

-XX: + PrintAdaptiveSizePolicy

आपको लगता है कि आवंटन के सबसे 1,048,592 बाइट्स की जो फिट बैठता है न 50% है और न ही एक भी 100% कर रहे हैं देखने के लिए सक्षम हो जाएगा सिंगल जी 1 क्षेत्र (जो आउटपुट में देखा गया है 1024 के = 1048576 बाइट्स)। मुझे लगता है कि इसका मतलब है कि प्रत्येक सरणी में कम से कम दो क्षेत्र होते हैं। चूंकि यह एक विशाल आवंटन है क्योंकि दूसरे क्षेत्र में अधिकांश खाली स्थान का उपयोग नहीं किया जा सकता है। यह तेजी से चरम ढेर विखंडन का कारण बनता है और आगे आवंटन असंभव बनाता है।

1

@yegodm से सहमत हैं। समाधान हेप क्षेत्र को बढ़ाने के लिए है -XX: G1HeapRegion आकार यह सुनिश्चित करने के लिए कि पिछले ह्यूमोनस ऑब्जेक्ट्स अब सुसंगत नहीं हैं और नियमित आवंटन पथ का पालन करेंगे। यहां पर भारी ऑब्जेक्ट आवंटन के बारे में और पढ़ें 1

संबंधित मुद्दे