2016-04-21 11 views
0

Wir haben einen Weblogic-Server, auf dem mehrere Apps laufen. Einige dieser Apps verwenden eine ActiveMQ-Instanz, die für die Verwendung des Weblogic XA-Transaktionsmanagers konfiguriert ist.OutOfMemoryError aufgrund einer großen Anzahl von ActiveMQ XATransactionId-Objekten

Jetzt, nach ca. 3 Minuten nach dem Start, löst die JVM einen OutOfMemoryError aus. Ein Heap-Dump zeigt, dass etwa 85% des gesamten Speichers von einer LinkedList belegt ist, die org.apache.activemq.command.XATransactionId-Instanzen enthält. Die Liste ist ein Root-Objekt und wir sind nicht sicher, wer es braucht.

Was könnte das verursachen?

Antwort

3

Wir hatten genau das gleiche Problem auf Weblogic 12c und activemq-ra. XATransactionId-Objektinstanzen wurden kontinuierlich erstellt, was zu einer Serverüberlastung führte.

Nach mehr als 2 Wochen Debugging haben wir festgestellt, dass WebLogic Transaction Manager versucht hat, einige ausstehende activemq-Transaktionen wiederherzustellen, indem die Methode recover() aufgerufen wird, die die IDs der Transaktion zurückgibt, die nicht abgeschlossen zu sein scheint müssen wiederhergestellt werden. Der Aufruf dieser Methode durch Weblogic hat immer eine nicht null Zahl n (immer die gleiche) zurückgegeben, und das verursacht die Erstellung einer n-Instanz des XATransactionId-Objekts.

Nach einigen Untersuchungen haben wir festgestellt, dass Weblogic standardmäßig seine TLOG-Transaktion TLOG im Dateisystem speichert und dies kann geändert werden, um in DB gespeichert zu werden. Wir dachten, dass ein Problem darin besteht, dass sich TLOGs im Dateisystem befinden und wir versuchten es in DB zu ändern und es funktionierte! Jetzt läuft unser Server für mehr als 2 Wochen ohne Neustart und Speicher ist stabil, da keine XATransactionId ein Teil von der notwendigen Menge davon erstellt wird;)

Ich hoffe, das wird Ihnen helfen und uns auf dem Laufenden halten, wenn es für Sie arbeitete .

Viel Glück!

+0

Ich bin nicht mit dem Projekt mehr, aber ich denke irgendwann Wir löschten das tx-Protokoll, da es definitiv veraltet war, was zu der Zeit das Problem löste. Daher als richtig markieren. –

0

Um ehrlich zu sein, es klingt wie Sie eine Tonne JMS-Nachrichten bekommen und entweder nicht verbrauchen oder, wenn Sie sind, Ihre Verbraucher nicht die Nachrichten bestätigen, wenn sie nicht im Modus automatische Bestätigung sind.

0

Überprüfen Sie den JMS-Warteschlangenrückstand. Es kann eine Warteschlange mit hohem Rückstand geben, die der Server versucht zu lesen. Diese Nachrichten sind möglicherweise durch einen Absturz beschädigt worden. Die beste Option ist, den Rückstand in JMS-Warteschlange zu löschen oder in einer anderen Warteschlange zu sichern