2016-04-09 3 views
2

Ich möchte absichtlich Elemente zu einer Datenstruktur hinzufügen, bis Java eine OutOfMemoryError auslöst und einen Heap-Dump unter Verwendung von -XX:+HeapDumpOnOutOfMemoryError ergreift. Ich verwende -Xmx100M, also erwartete ich, dass der Heap-Dump fast 100 MB Live-Objekte anzeigen würde, aber stattdessen zeigt es nur 46 MB.Warum zeigt mein Java-Heap-Dump nur den halben Heap an?

Warum würde Java OOM mit einem 100-MB-Heapspeicher werfen, wenn es nur 46 MB Live-Objekte gibt?

(.. Ich weiß, es gibt eine gute Chance, die ich habe nicht genügend Informationen, um diese Frage zu beantworten gegeben, aber ich bin nicht sicher, was relevant ist glücklich weitere Informationen je nach Bedarf hinzugefügt werden)

EDIT: Das Ende die -verbose:gc Ausgabe:

[Full GC (Ergonomics) [PSYoungGen: 1056K->64K(2560K)] [ParOldGen: 7116K->7116K(7168K)] 8173K->7180K(9728K), [Metaspace: 5981K->5981K(1056768K)], 0.0071141 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 64K->0K(2560K)] [ParOldGen: 7116K->7075K(7168K)] 7180K->7075K(9728K), [Metaspace: 5981K->5974K(1056768K)], 0.0190392 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
java.lang.OutOfMemoryError: Java heap space 
+0

Sie OutOfMemoryErrors für eine Reihe von Gründen bekommen, einschließlich aus Heap-Speicher ausgeführt wird. Was ist der eigentliche Fehler, den Sie bekommen? –

+0

Hallo Peter. Es ist dies: 'Ausnahme im Thread" Haupt "java.lang.OutOfMemoryError: Java-Heap-Raum \t bei java.util.Arrays.copyOf (Arrays.java: 3308)' – Doradus

+0

Wenn Sie nicht ein großes Array erstellen, erhalten Sie ein Dump Dump ohne dieses Array. BTW ein 100 MB ist ein winziger Heap in diesen Tagen, bist du sicher, dass du es so klein sein musst? –

Antwort

4

Heap ist in zwei Abschnitte junge Generation und eine alte Generation aufgeteilt. Sie erhalten OOM, wenn z.B. die alte Generation ist so voll oder fragmentiert, dass es unmöglich ist, das Objekt von der jungen Generation bis zu den alten (und wahrscheinlich anderen) zu fördern.

Wenn Sie die GC-Nutzung mit z. -verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log dann sehen Sie jede Generation Größen.

können Sie sehen, wie Generation zu stimmen hier Größen https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html

+0

Danke für den Link! Ich hätte gedacht, dass sie die junge Generation in einem Stressszenario wie meiner automatisch verkleinern würden. Das Setzen von '-XX: NewRatio = 50' oder' -XX: MaxNewSize = 1M' bringt beide über 90MB Live-Objekte in den Heap-Dump, was sehr sinnvoll ist. – Doradus

Verwandte Themen