4 Stimmen

IBM Websphere OutOfMemoryException

Oft habe ich OutOfMemoryException auf IBM Websphere Application Server gefunden. Ich denke, diese Ausnahme auftreten, weil meine Anwendung abrufen Huge Daten aus der Datenbank. Also, ich begrenze alle Abfrage nicht retreive Daten mehr als 1000 Datensätze und setzen JVM von WAS folgen

+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent  
                    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000 
                          -Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc  
                          -Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)

Und ich fand heapdump , javacore y schnappen Dateien im Ordner "profiles" können mir die Ursache des Problems nennen, aber ich weiß nicht, wie man Heapdump-, Javacore- und Snap-Dateien liest/verwendet.

Bitte sagen Sie mir, wie ich OutOfMemoryException verhindern/vermeiden/beheben kann. Danke

3voto

Adam Crume Punkte 15248

Wenn Sie sich die Heap-Dump-Dateien ansehen möchten, bietet IBM Tools an, um sie zu analysieren aquí .

1voto

James Schek Punkte 17598

Die Antwort auf diese Frage hängt von der Meldung ab, die mit der OutOfMemoryException verbunden ist. Sie können auch -XX:MaxPermSize=... ausprobieren und den Wert auf etwas Größeres wie 256m setzen.

Wenn Sie irgendwo eine rekursive Funktion haben, kann dies auch einen Stapelüberlauf verursachen.

Wenn möglich, geben Sie bitte die mit der Ausnahme verbundene Meldung an. Ein Stacktrace könnte ebenfalls hilfreich sein.

1voto

dertoni Punkte 1763

"Danke für die Erinnerung" ist ein guter Artikel über die Nutzung des Speichers durch die JVM, der bei der Analyse dieses Problems helfen könnte...

Dank an bwalliser für diesen Link

0voto

Brian Deterling Punkte 13329

Versuchen Sie, das Problem lokal zu reproduzieren, damit Sie ein Tool wie JProfiler zur Fehlersuche verwenden können. Selbst wenn Sie lokal keinen OOM erzwingen können, ist es wahrscheinlich, dass Sie den Speicheranstieg in JProfiler sehen werden. Dann machen Sie Schnappschüsse und suchen nach Klassen, die nicht garbage collected werden. Das ist keine exakte Wissenschaft, aber es ist viel einfacher, als einen IBM-Heapdump zu durchsuchen. Wenn es aber sein muss, kann man einen Heapdump auch mit HeapRoots untersuchen. Es kann von der Version abhängen, die Sie benutzen. Ich weiß, dass einige Versionen des IBM JDK Probleme mit der Komprimierung haben, so dass Sie, selbst wenn Sie viel Speicher haben, ein OOM erhalten können, weil kein ausreichend großes Fragment verfügbar ist.

0voto

Ich nehme an, dass Sie Hibernate/JPA als Persistenzanbieter verwenden? Verwenden Sie einen Cache der zweiten Ebene? Wenn ja, haben Sie in Erwägung gezogen, große Ergebnismengen aus dem Cache zu verdrängen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X