2015-10-19 12 views
5

Ausgabe BeschreibungmetaSpace Speicher concumption Fragen von Java 8-Anwendungen auf WIlfly Einsatz 8.2.1

Ich bemerkte, dass jeder Einsatz eines unserer Java8 Anwendung auf Wildfly 8.2.1 verwendet etwa 30-40 MBs von metaSpace Speicher Schwimmbad. Das ist in Ordnung, aber die Sache ist, dass, sobald ich die gleiche Anwendung erneut vertreibe, die Metaspace-Speicherbelegung um dieselben 30-40 MB erhöht wird, während der alte bereits zugewiesene Speicher nicht freigegeben wird.

Ich würde es nicht einmal bemerken, aber die Sache ist, dass wir ~ 20 Anwendungen haben und von Zeit zu Zeit muss ich bis zu 10 von ihnen gleichzeitig bereitstellen. Dies wiederum führt zu einem gruseligen Bild.

enter image description here Grundsätzlich werden die 2 Umsetzungen von ~ 10 Anwendungen angezeigt.

Ich bin mir nicht sicher, warum GC den Speicher nicht freigeben kann, der den alten Klassen zugewiesen wird. Dieser Server hat insgesamt 16 GB physischen Speicher, so dass ich alle Anwendungen bis zu 20-40 mal neu bereitstellen kann und das ist es. Der App-Server erreicht das Limit und reagiert nicht mehr auf Befehle.

So wäre ich sehr dankbar, wenn mir jemand helfen könnte, zu verstehen, was das eigentliche Problem sein könnte:

  1. Ist es ein Java8 Problem? (jdk 1.8.0_40-b26)
  2. Ist es ein Wildfly 8.2.1 Problem?
  3. Oder ist die Antwort so einfach wie möglich, dass die Ursache meine Code-Basis ist? Wenn ja, könnten Sie mir bitte sagen, was der eigentliche Grund sein könnte?

Einige weiteren Details zu meiner Code-Basis

1) Zusammen mit Wildfly ich 2 eigenständigen HornetQ Server bezogen, jede Anwendung verwendet ~ 5 Kanäle mit jeweils mindestens 5 gleichzeitigen Verbrauchern auf. Dies ergibt wiederum mindestens 25 Threads für jede App und mindestens 25 * 20 = 500 Threads insgesamt.

2) Für alle Low-Level-JMS-Operationen verwende ich Spring JMS.

Antwort

1

WildFly 10.0.0.Final "java.lang.OutOfMemoryError: Metaspace" tritt auf und wird behoben. Siehe Agile Board of Wildfly

https://issues.jboss.org/browse/WFLY-6173

+0

Willkommen bei Stack Overflow! Ein Link zu einer potentiellen Lösung ist immer willkommen, aber bitte [hinzufügen Kontext rund um den Link] (http://meta.stackoverflow.com/a/8259/169503) so Ihre Kolleginnen und Nutzer eine Vorstellung haben, was es ist und warum es Dort. Zitiere immer den relevantesten Teil eines wichtigen Links, falls die Zielseite nicht erreichbar ist oder permanent offline geschaltet wird. Berücksichtigen Sie dabei, dass sein kaum mehr als ein Link zu einer externen Website ist ein möglicher Grund, [Warum und wie werden einige Antworten gelöscht?] (Http://stackoverflow.com/help/deleted-answers). – ddb

+0

Der Kontext ist da. Es ist ein Fehler in der Anwendung und wird behoben. Angesichts der Tatsache, dass dieser Fehler häufig ist und diese Seite eines der Top-Google-Treffer für das Problem ist, würden Sie durch das Löschen dieser Antwort mehr Schaden für die Community als gut verursachen. – tggm

1

Um empirisch zu bestimmen, wo und wenn Sie ein Leck haben (Sie könnten kein Leck haben - es könnten legitime Klassen sein, die während legitimen Gründen während der Bereitstellung geladen werden), versuchen Sie taking a heap dump zur richtigen Zeit (dh vor oder nach der Anstieg im Metaspace auftritt). Nehmen Sie dann einen weiteren Heapspeicherauszug. Vergleichen Sie die beiden Heap-Dumps mit einem Tool wie MAT oder Yourkit. Der Unterschied zwischen den beiden sagt Ihnen, welche Klassen geladen werden.

Lecks im Metaspace sind ziemlich selten, weil Sie nur so viele Klassen laden müssen, aber es könnte auch ziemlich exotisch sein.

Lassen Sie mich wissen, was Sie finden und glücklich Jagd! Das macht Spaß. :-)

+0

Ich analysierte beide Heapspeicherauszüge folgen (vor und nach der Umschichtung ~ 5 artifcats) und bemerkte etwas suspecious noch vor Berechnung der Differenz: 1.vor http://snag.gy/JGZdf.jpg 2. nach http://snag.gy/VqFiN.jpg Und hier ist der Unterschied: http://snag.gy/xfDeV.jpg ich, dass char sehen [] Array wächst stark. (scheint wie Inhalt von String) Hier ist der Inhalt von org.jboss ... JavaZipFileSystem class loader: http://snag.gy/bbYq7.jpg So habe ich den Eindruck, dass WildFly einfach alle Artefakte in die lädt Speicher und gibt sie auch nach einer erneuten Bereitstellung nicht frei. Könnte das wahr sein und ist es in Ordnung? – Andrew

+0

Cool! Hier sind ein paar Vorschläge: 1. Sie wollen ein paar Deponien zwischen Einsätzen ein Muster von monoton steigende Speichernutzung zu finden, die zufällige Objekte herausgefiltert werden. 2. Versuchen Sie, Daten innerhalb der Objekte zu finden, von denen Sie vermuten, dass sie das Leck verursachen (d. H. Werte in Knoten); Das kann deine Spurensicherung führen. 3. Stellen Sie sicher, dass Sie den Metabereich untersuchen, in dem das Leck vermutet wird, und nicht den Heap. 4. Ja, Char [] -Typen und andere Primitive schwanken stark. Es ist einfacher, das Leck auf höheren Ebenen zu finden. 5. Ja, WildFly könnte problemlos Klassen laden und nicht freigeben. Das Entladen der Klasse ist für eine JVM optional. – entpnerd

+0

Haben Sie eine Lösung gefunden? Ich habe das gleiche Problem – Deibys