मेरे परीक्षण कोड: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
के साथ यह ठीक काम कर रहा है और सरणी पूरी तरह से भर गई थी।
आपने उपयोग किए गए मेमोरी आकारों की गणना कैसे की? –
-XX: + PrintGCDetails हीप स्थिति प्रिंट करता है जैसा कि आप मेरे प्रश्न 'कुल 20 9 7152 के, 1048100K' का उपयोग कर सकते हैं। मैंने विंडोज और लिनक्स दोनों की जांच की। व्यवहार वही है –
मेरा मतलब आपके कोड द्वारा आवश्यक मेमोरी है .... –