2016-06-16 18 views
1

Ich habe dieses seltsame Problem in meinem einen der Produktion Anwendung. Ich habe den Heap-Speicherplatz auf dem Server überprüft und keine Anomalien gefunden (siehe unten stehenden Bildschirm), aber ich bekomme immer noch den Fehler bei einigen wenigen Operationen, die meine Anwendung ausführt. Ist es möglich?Java Heap nicht voll, aber immer noch Fehler java.lang.OutOfMemoryError: Java-Heap-Speicher

enter image description here

java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:2271) 
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) 
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) 
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876) 
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1785) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1188) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 

ich das Problem bin Verdacht einer von der Liste zu sein, in dem Code, der auf einmal um fast 2 M Aufzeichnungen gefüllt wird, aber immer noch nicht sicher, warum dies geschieht, wie der Haufen ist nicht voll oder maximal angezeigt, aber immer noch diesen Fehler. Ist es möglich? Was sind die möglichen Szenarien, gibt es eine Möglichkeit, dies zu verhindern? Dies ist eine Produktionsanwendung, so dass ich den Code nicht teilen könnte. Bitte hilf mir.

+0

Haben Sie einen Heap-Dump genommen und analysiert? – OldProgrammer

+0

Ja, ich habe den Heap-Dump analysiert, aber nichts bestimmtes gefunden. – nikhilgupta86

+1

Siehe http://stackoverflow.com/questions/13772802/java-lang-outofmemoryerror-event-though-plenty-of, aber Sie sagen, dass Sie 2M, nicht 2B Elemente speichern, und das ist weit unter der Grenze von Integer .MAX_VALUE, also nicht sicher, was hier vor sich geht. – OldProgrammer

Antwort

2

Es muss nicht voll sein, um OutOfMemoryError zu werfen. Es muss in einem Zustand sein, in dem die aktuelle Größe plus die Größe der nächsten angeforderten Zuweisung das Maximum überschreitet. Hier kopieren Sie eindeutig eine groß genug Array, die Zuordnung würde auslösen (hat ausgelöst) diese Bedingung.

0

Die Funktion oben im Stack-Trace, der das Array kopiert, scheint zu prüfen, ob genügend Speicherplatz für das gesamte Array vorhanden ist, bevor mit dem Kopieren begonnen wird. Das würde erklären, warum der Heap nicht gefüllt wird, wenn der Fehler ausgelöst wird. Könnte das gesamte kopierte Array sogar in den Heap passen?

+0

Nein, die JVM prüft gerade. Die Funktion teilt nur zu. – EJP

0

Von java.lang.OutOfMemoryError:

Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. OutOfMemoryError objects may be constructed by the virtual machine as if suppression were disabled and/or the stack trace was not writable.

Kurz gesagt, die Operation, die Sie versuchen zu erreichen erfordert eine bestimmte Menge an Speicher auf dem Heap (ein neues Array mit 2-Millionen-Elemente zu schaffen irgendwo gehen zu verlangen, in der Nachbarschaft von 8-16 + Megabyte abhängig von Ihrer JVM-Implementierung), und Ihre JVM sagt, dass es einfach nicht so viel zur Verfügung hat. Der Speicher-Spike wird nicht über dem verfügbaren Heap angezeigt, da die JVM das vor dem Auftreten stoppt.

Beachten Sie, dass dies ein Fehler im Gegensatz zu einer Ausnahme ist, weshalb keiner der Javadoc für den Stacktrace es nicht erwähnt und warum Sie erwartet haben, nicht im Gegensatz zu einer geprüften Ausnahme zu behandeln.