2014-10-09 10 views
6

Ich überwache meine Java-Anwendung (geschrieben in JDK 1.7) mit VisualVM. Das folgende Diagramm zeigt die Auslastung des Heapspeichers für die Dauer der Ausführung dieser Anwendung.VisualVM: Ideal Heap Memory Usage Graph

enter image description here

in diesem Diagramm diejenigen Blick sehen, dass viele Spitzen in ihm gibt es. Diese Spitzen geben die Erstellung von Objekten durch die Anwendung an. Sobald die Anwendung mit ihnen fertig ist, zerstört sie sie mit GC (implizit in diesem Fall genannt).

Auch hier ist ein Screenshot von Speicher-Profiler, wenn die Anwendung noch zu mir

enter image description here

die nach oben und unten Art des Diagramms zeigt eine effiziente Nutzung von Java-Objekten ausgeführt wird. Ist diese Schlussfolgerung richtig?

Was ist die ideale Art des Heap-Verwendungsgraphen, auf den man zielen sollte?

Gibt es noch andere Möglichkeiten, wie ich die Heapspeicherauslastung meiner Anwendung verbessern kann?

+2

Viele Spikes auf der rechten Seite Show-Programm produziert mehr kurzlebige Objekte im Laufe der Zeit. Möglicherweise kann dies optimiert werden. –

+0

Ihr Speicherverbrauch sieht tadellos aus –

+0

@VictorSorokin Der JVM GC behandelt viele kurzlebige Objekte ziemlich gut. Dies ist kein Problem. – pickypg

Antwort

3

Für mich die up-down-Natur des Diagramms zeigt eine effiziente Nutzung von Java-Objekten. Ist diese Schlussfolgerung richtig?

Ich würde sagen, es ist die effiziente Nutzung des Garbage Collector. Ich würde vorschlagen, weniger Objekte zu erstellen, könnte effizienter sein.

Was ist die ideale Eigenschaft des Heap-Verwendungsgraphen, auf den man zielen sollte?

Das hängt von Ihrer Anwendung ab. Ich ziele auf eine, die fast vollständig flach ist.

Gibt es noch andere Möglichkeiten, wie ich die Heapspeicherauslastung meiner Anwendung verbessern kann?

Lasten

  • schaffen weniger Müll. Verwenden Sie Ihren Speicherprofiler, um herauszufinden, wo der Müll erstellt wird.
  • machen Sie den Haufen größer, so dass es GC nicht so oft.
  • Ihre gespeicherten Daten aus Haufen bewegen (Sie scheinen viel nicht zu haben)

In Ihrem Fall die beste Option wäre, die Menge an Müll zu reduzieren, die Sie produzieren.

+0

Ich erschaffe tatsächlich den gleichen Java-Typ von Objekten, wenn ich sie benötige. Wäre es hilfreich, die erstellten Objekte wiederzuverwenden, sie aber zu initialisieren (auf Null zu setzen), wenn sie nicht benötigt werden. In diesem Fall wird jvm sie nicht als Müll markieren. Daher würde der GC weniger häufig aufgerufen werden. – davison

+0

@davison könnte es helfen, wenn Sie die meisten Objekte recyceln. Wenn Sie nur ein Objekt der obersten Ebene recyceln, hilft das möglicherweise nicht. Wenn Sie keinen kommerziellen Profiler wie YourKit verwendet haben, könnten Sie feststellen, dass es 10 Dinge gibt, die Sie besser optimieren können. Sie können eine Evaluierungslizenz für YourKit und andere Profiler erhalten. Wenn ich nicht messe, rate ich nur. –

+1

@davison Sie können diese Iteratoren mit einer indizierten Schleife beseitigen. –

1

Solange die Heap-Größe im Laufe der Zeit fast gleich bleibt, sind Sie in Ordnung. Der verwendete Heap sollte aufgrund der Art der Unterbrechung der Welt-GC in Sun JVM auf und ab gehen. Es sieht so aus, als würden in Ihrer App viele kurzlebige Objekte erstellt. Dies ist möglicherweise ineffizient, aber manchmal müssen Sie sie erstellen. Es ist der Lebensstil von Java: D