81 Stimmen

Wie kann man den Java-Speicherverbrauch überwachen?

Wir haben eine J2ee-Anwendung, die auf Jboss läuft, und wir wollen ihre Speichernutzung überwachen. Derzeit verwenden wir den folgenden Code

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

Dieser Code funktioniert gut. Das heißt, er zeigt eine Speicherkurve, die der Realität entspricht. Wenn wir eine große XML-Datei aus einer DB erstellen, geht die Kurve nach oben, nachdem die Extraktion beendet ist, geht sie nach unten.

alt text

Ein Berater sagte uns, dass der explizite Aufruf von gc() falsch sei, "lass jvm entscheiden, wann gc ausgeführt werden soll". Im Grunde waren seine Argumente die gleichen wie hier erörtert . Aber ich verstehe es immer noch nicht:

  • Wie kann ich meine Speichernutzungskurve anzeigen lassen?
  • Was ist falsch an der expliziten gc()? Ich interessiere mich nicht für kleine Leistungsprobleme, die bei explizitem gc() auftreten können und die ich auf 1-3% schätzen würde. Was ich brauche, ist ein Speicher- und Thread-Monitor, der mir bei der Analyse unseres Systems auf der Kundenseite hilft.

7voto

Nick Holt Punkte 32407

Schauen Sie sich die JVM-Args an: http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#DebuggingOptions

XX:-PrintGC Druckt Nachrichten bei der Garbage Collection. Verwaltbar.

-XX:-PrintGCDetails Weitere Details bei der Garbage Collection ausgeben. Verwaltbar. (Eingeführt in 1.4.0.)

-XX:-PrintGCTimeStamps Druckt Zeitstempel bei der Garbage Collection. Verwaltbar (Eingeführt in 1.4.0.)

-XX:-PrintTenuringDistribution Druckt Informationen über das Alter des Tenurings.

Sie werden die JVM zwar nicht mit expliziten Aufrufen von System.gc() Sie haben möglicherweise nicht die von Ihnen erwartete Wirkung. Um wirklich zu verstehen, was mit dem Speicher in einer JVM vor sich geht, lesen Sie alles, was Brian Goetz schreibt.

6voto

vsingh Punkte 5947

P h alt text

alt text

5voto

Steve B. Punkte 52372

Die explizite Ausführung von System.gc() auf einem Produktionssystem ist eine schreckliche Idee. Wenn der Speicher eine gewisse Größe erreicht, kann das gesamte System einfrieren, während eine vollständige GC ausgeführt wird. Auf einem Server, der mehrere Gigabyte groß ist, kann sich das leicht bemerkbar machen, je nachdem, wie der JVM konfiguriert ist und wie viel Spielraum er hat, usw. usw. - ich habe schon Pausen von mehr als 30 Sekunden gesehen.

Ein weiteres Problem ist, dass Sie durch den expliziten Aufruf von GC nicht wirklich überwachen, wie die JVM die GC ausführt, sondern sie tatsächlich verändern - je nachdem, wie Sie die JVM konfiguriert haben, wird sie Garbage Collect durchführen, wenn es angebracht ist, und normalerweise inkrementell (sie führt nicht einfach eine vollständige GC aus, wenn ihr der Speicher ausgeht). Was Sie ausdrucken werden, wird nicht mit dem übereinstimmen, was die JVM von sich aus tun wird - zum einen werden Sie wahrscheinlich weniger automatische/inkrementelle GCs sehen, da Sie den Speicher manuell leeren werden.

Wie Nick Holt in seinem Beitrag betont, gibt es bereits Optionen zum Drucken der GC-Aktivität als JVM-Flags.

Sie könnten einen Thread einrichten, der in angemessenen Abständen die freien und verfügbaren Speicherplätze ausgibt, um den tatsächlichen Speicherverbrauch zu ermitteln.

5voto

Pablojim Punkte 8312

Wenn Sie dies von der Kommandozeile aus tun möchten, verwenden Sie jstat:

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

Es liefert Rohdaten in konfigurierbaren Intervallen, was für die Protokollierung und grafische Darstellung sehr nützlich ist.

4voto

Zoukaye Punkte 41

Wenn Sie Java 1.5 verwenden, können Sie sich ManagementFactory.getMemoryMXBean() ansehen, die Ihnen Zahlen für alle Arten von Speicher liefert: Heap und Non-Heap, perm-gen.

Ein gutes Beispiel finden Sie dort http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space

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