Wie erkennt man den Speichermangel?

7

Ich habe eine Anwendung, die auf Websphere Application Server 6.0 ausgeführt wird, und stürzt fast jeden Tag aufgrund von Out-of-Memory ab. Von ausführlichen GC ist sicher, dass es die Speicherlecks gibt (viele von ihnen)

Leider wird die Anwendung von einem externen Anbieter zur Verfügung gestellt und die Dinge behoben ist langsam & amp; schmerzhafter Prozess. Als Teil des Prozesses muss ich die Protokolle und Heapdumps jedes Mal sammeln, wenn der OOM auftritt.

Jetzt suche ich nach einer Möglichkeit, es zu automatisieren. Grundlegendes Problem ist das Erkennen der OOM-Bedingung. Eine Möglichkeit besteht darin, ein Shell-Skript zu erstellen, das regelmäßig nach neuen Heapdumps sucht. Dieser Ansatz scheint mir irgendwie dreckig zu sein. Ein anderer Ansatz könnte sein, den JMX irgendwie zu nutzen. Aber ich habe wenig oder keine Erfahrung in diesem Bereich und habe nicht viel Ahnung, wie es geht.

Oder ist in WAS eine Art Trigger / Haken dafür? Vielen Dank für jeden Rat!

    
Jaromir Hamala 25.08.2009, 08:42
quelle

9 Antworten

4

Ich sehe zwei Optionen, wenn Sie automatisch Heap-Dumping durchführen möchten, aber @ Marks Lösung mit Heap-Dump auf OOM ist nicht zufriedenstellend.

  1. Sie können das MemoryMXBean zum Erkennen verwenden hoher Speicherdruck und dann programmgesteuert einen Heapspeicher erstellen , wenn die Verwendung (oder das Nutzungsdelta) hoch erscheint.
    • Sie können regelmäßig Informationen zur Speichernutzung abrufen und Heap-Dumps mit einem Cron-Shell-Skript erstellen, indem Sie jmap (funktioniert sowohl lokal als auch remote).

Es wäre nett, wenn Sie einen Rückruf auf OOM haben könnten, aber, ähm, dieser Callback würde wahrscheinlich einfach mit einem OOM-Fehler abstürzen. :)

    
gustafc 25.08.2009, 09:45
quelle
9

Sie können die folgenden Argumente beim Start an die JVM übergeben und ein Heap-Dump wird automatisch bei einem OutOfMemoryError generiert. Mit dem zweiten Argument können Sie den Pfad für die Heap-Dump-Datei angeben. Mit dieser Option können Sie prüfen, ob eine bestimmte Datei vorhanden ist, um festzustellen, ob ein Heap-Dump stattgefunden hat.

%Vor%     
Mark 25.08.2009 08:47
quelle
3

Haben Sie sich JConsole angesehen? Es verwendet JMX, um Ihnen eine Vielzahl von JVM-Messdaten einschließlich Speicherinformationen sichtbar zu machen. Es wäre wahrscheinlich eine Überwachung Ihrer Anwendung wert, um damit zu beginnen, ein Gefühl dafür zu bekommen, wie / wann der Speicher verbraucht wird. Sie können feststellen, dass der Speicher über den Tag hinweg oder bei Verwendung bestimmter Funktionen gleichmäßig verbraucht wird.

Werfen Sie einen Blick auf den Abschnitt , der einen niedrigen Arbeitsspeicher erkennt des obigen Links.

Wenn Sie möchten, können Sie dann einen JMX-Client schreiben, um die Anwendung automatisch und triggern alle erforderlichen Aktionen. JConsole zeigt an, welche JMX-Methoden Sie abfragen müssen.

    
Brian Agnew 25.08.2009 09:37
quelle
1

Und eine Alternative zum Warten, bis die Anwendung abgestürzt ist, besteht darin, einen kontrollierten Neustart wie jede Nacht durchzuführen, wenn Sie optimistisch sind, dass er zwölf Stunden überleben kann.

Vielleicht kann sogar Websphere das für Sie tun!?

    
Andreas_D 25.08.2009 08:50
quelle
1

Sie können eine Listener-Klasse (Sitzungsbereich oder Anwendungsbereichs-Listener) hinzufügen, die jedes Mal aufgerufen wird, wenn ein neues Objekt im Bereich Sitzung / App hinzugefügt wird.

Hier können Sie versuchen, den gesamten von der App verwendeten Speicher (Log es) als Aufruf run gc zu überprüfen (beachten Sie, dass das Aufrufen nicht bedeutet, dass gc immer ausgeführt wird)

(Das oben genannte gilt für den Protokollierungsteil und gc basierend auf dem Nutzungswachstum)

Für geplante GC: Zusätzlich können Sie eine Timer-Task-Klasse behalten, die alle paar Stunden läuft und eine Anfrage für gc absetzt.

    
techzen 25.08.2009 09:05
quelle
1

Unsere Erfahrung mit ITCAM war aus der Überwachungsperspektive weniger als hervorragend. Wir haben es zugunsten von CA Wily Introscope abgeladen.

    
zkarthik 25.08.2009 15:38
quelle
0

Haben Sie sich das jvisualvm-Tool in den neuesten JDKs von Java 6 angeschaut?

Es ist großartig, um laufenden Code zu überprüfen.

    
quelle
0

Ich würde bestreiten, dass Sie die Heap-Dumps benötigen, wenn das OOM auftritt. Periodische Sammlung der Informationen im Laufe der Zeit sollte das Bild von dem, was vor sich geht, geben.

Wie festgestellt wurde, existieren verschiedene Werkzeuge zur Analyse dieser Probleme. Ich hatte Erfolg mit ITCAM für WebSphere, als IBMer habe ich direkten Zugriff darauf. Wir waren sehr schnell in der Lage, die genauen Codezeilen in der Problemsituation zu identifizieren.

Wenn es irgendeinen Weg gibt, ein Werkzeug dieser Art zu bekommen, dann ist das der richtige Weg.

    
djna 25.08.2009 15:20
quelle
0

Es sollte möglich sein, ein einfaches Programm zu schreiben, um die Prozessliste vom Kernel zu bekommen und es zu scannen, um zu sehen, ob Ihr WAS-Prozess noch läuft. Auf einer Unix-Box könnte man in wenigen Minuten etwas in Perl aufpeitschen (wenn man Perl kennt), nicht sicher, wie schwer es unter Windows wäre. Führen Sie es ungefähr alle fünf Minuten als geplante Aufgabe aus, und wenn der Prozess nicht angezeigt wird, können Sie einen anderen Prozess abzweigen, der sich mit dem Heapspeicherauszug befassen und WAS erneut starten würde.

    
TMN 22.12.2010 20:39
quelle