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.

73voto

amischiefr Punkte 4549

Wenn Sie wirklich sehen wollen, was im Speicher der VM vor sich geht, sollten Sie ein gutes Tool wie VisualVM . Das ist Freie Software und eine großartige Möglichkeit zu sehen, was vor sich geht.

Nichts ist wirklich "falsch" an expliziten gc() Anrufe. Denken Sie jedoch daran, dass Sie bei einem Anruf gc() Sie "schlagen" vor, dass der Garbage Collector ausgeführt wird. Es gibt keine Garantie dafür, dass er genau zu dem Zeitpunkt ausgeführt wird, zu dem Sie den Befehl ausführen.

30voto

Es gibt Tools, mit denen Sie die Speichernutzung der VM überwachen können. Die VM kann Speicherstatistiken mit JMX offenlegen . Sie können auch GC-Statistiken drucken um zu sehen, wie sich der Speicher im Laufe der Zeit entwickelt.

Der Aufruf von System.gc() kann die Leistung des GC beeinträchtigen, da Objekte vorzeitig von der neuen in die alte Generation verschoben werden und schwache Referenzen vorzeitig gelöscht werden. Dies kann zu einer geringeren Speichereffizienz, längeren GC-Zeiten und geringeren Cache-Treffern führen (bei Caches, die "weak refs" verwenden). Ich stimme mit Ihrem Berater überein: System.gc() ist schlecht. Ich würde sogar so weit gehen, dass ich deaktivieren mit Hilfe des Befehlszeilenschalters.

12voto

Tom Punkte 41522

12voto

Felix Punkte 5424

Sie können einen Blick werfen auf Bühnenmonitor . Es ist ein Open-Source-Java (Web) Anwendung Performance Monitor. Es erfasst Antwortzeitmetriken, JVM-Metriken, Anfragedetails (einschließlich eines vom Request Profiler erfassten Call Stacks) und mehr. Der Overhead ist sehr gering.

Optional können Sie die großartige Zeitreihendatenbank Graphite verwenden, um eine lange Historie von Datenpunkten zu speichern, die Sie mit ausgefeilten Dashboards betrachten können.

Exemple : JVM Memory Dashboard

Werfen Sie einen Blick auf die Projekt-Website um Bildschirmfotos, Funktionsbeschreibungen und Dokumentationen zu sehen.

Anmerkung: Ich bin der Entwickler von stagemonitor

10voto

Yishai Punkte 87548

Ich würde sagen, dass der Berater in der Theorie Recht hat, und Sie in der Praxis. Da die Das Sprichwort sagt :

In der Theorie sind Theorie und Praxis identisch. In der Praxis sind sie es nicht.

In der Java-Spezifikation heißt es, dass System.gc vorschlägt, die Garbage Collection aufzurufen. In der Praxis wird einfach ein Thread erzeugt und sofort auf der Sun JVM ausgeführt.

Obwohl Sie theoretisch eine fein abgestimmte JVM-Implementierung der Garbage Collection durcheinander bringen könnten, sollten Sie sich darüber keine Gedanken machen, es sei denn, Sie schreiben generischen Code, der auf jeder beliebigen JVM eingesetzt werden soll, die es gibt. Wenn es für Sie funktioniert, tun Sie es.

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