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.

1voto

norber_san Punkte 1

Über System.gc() Ich habe gerade in der Dokumentation von Oracle den folgenden Satz gelesen ici

Die Auswirkung expliziter Garbage Collections auf die Leistung kann gemessen werden, indem man sie mit dem Flag -XX:+DisableExplicitGC deaktiviert, was die VM veranlasst, Aufrufe von System.gc() zu ignorieren.

Wenn Ihr VM-Anbieter und Ihre Version dieses Flag unterstützen, können Sie Ihren Code mit und ohne dieses Flag ausführen und die Leistung vergleichen.

Beachten Sie auch, dass dem oben zitierten Satz dieser Satz vorangestellt ist:

Dies kann dazu führen, dass eine größere Sammlung durchgeführt werden muss, obwohl dies nicht notwendig ist (z. B. wenn eine kleinere Sammlung ausreichen würde), und sollte daher im Allgemeinen vermieden werden.

0voto

Aakash Punkte 329

Wie bereits vorgeschlagen, sollten Sie VisualVM ausprobieren, um eine grundlegende Übersicht zu erhalten.

Sie können auch Eclipse MAT verwenden, um eine detailliertere Speicheranalyse durchzuführen.

Es ist in Ordnung, ein System.gc() zu verwenden, solange Sie für die Korrektheit Ihres Programms nicht davon abhängig sind.

0voto

bgw Punkte 2007

Das Problem mit system.gc ist, dass die JVM dem Garbage Collector bereits automatisch Zeit auf der Grundlage der Speichernutzung zuweist.

Wenn Sie jedoch z. B. in einer sehr speicherbegrenzten Umgebung arbeiten, wie z. B. auf einem mobilen Gerät, können Sie mit System.gc manuell mehr Zeit für die Garbage Collection einplanen, allerdings auf Kosten der Prozessorzeit (aber, wie Sie bereits sagten, sind Sie nicht so besorgt über Leistungsprobleme von gc).

Die beste Praxis wäre wahrscheinlich nur dort zu verwenden, wo Sie große Mengen an Deallokationen durchführen (z. B. beim Flushen eines großen Arrays).

Da Sie sich lediglich Sorgen um die Speichernutzung machen, können Sie auch gc aufrufen, oder Sie können

0voto

tdaget Punkte 528

JavaMelody könnte eine Lösung für Ihren Bedarf sein.

Entwickelt für Java EE-Anwendungen, misst und erstellt dieses Tool Berichte über den realen Betrieb Ihrer Anwendungen in beliebigen Umgebungen. Es ist kostenlos und quelloffen und lässt sich leicht in Anwendungen mit einer gewissen Historie integrieren, ohne Datenbank oder Profilerstellung, wirklich leichtgewichtig.

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