2015-06-29 1 views
7

Ich verwende JVM Explorer - link to JVM Explorer, um meine Spring-Anwendung zu profilieren. Ich habe folgende Fragen dazu.Warum nehmen die Speicherbelegung und die Anzahl der geladenen Klassen weiter zu?

  • Warum ‚haben Heap-Speicher‘ wird immer größer, auch nachdem die Anwendung hat begonnen und haben alle Anfragen noch nicht erhalten? (Bild 1)

  • Warum auch nach der Garbage Collection und vor dem Empfang von Anfragen 'Used Heap Memory' steigt weiter? (Bild2)

  • Warum nach Garbage Collection, durch das Senden einiger Anfragen an die Anwendung Anzahl der geladenen Klassen steigt? Soll die Anwendung keine vorherigen Klassen verwenden? Warum erhöht es nur fast alles (Heap, Anzahl der geladenen Klassen)? (Image3)

    Nach der Anwendung gestartet wird - enlarge image enter image description here

    Nach einem Klick auf 'Ausführen Garbage Collector' Button. - enlarge image

enter image description here

Nach einigen Anfragen an die Anwendung nach Abschluss der Garbage Collection Procedure Senden - enlarge image

enter image description here

Antwort

4

Warum 'Gebrauchte Heap-Speicher' hält erhöht sich auch nach der Anwendung ist gestartet und hat noch keine Anfragen erhalten? (Bild 1)

Etwas in Ihrer JVM erstellt Objekte. Sie würden einen Speicherprofiler benötigen, um zu sehen, was das macht. Es könnte Teil von Swing oder einer anderen Anwendung oder einer anderen Bibliothek sein.

BTW Die meisten Profiling-Tools verwenden JMX, die eine Menge Müll verarbeitet. z.B. Wenn ich FlightRecorder oder VisualVM auf einigen meiner Anwendungen starte, zeigt dies, dass das JMX-Monitoring den größten Teil des Mülls erzeugt.

Warum auch nach der Garbage Collection und vor dem Empfang von Anfragen "Used Heap Memory" weiter zunimmt? (Bild2)

Was immer Objekte erstellt hat, erstellt immer noch Objekte.

Warum nach Garbage Collection, durch das Senden einiger Anfragen an die Anwendung Anzahl der geladenen Klassen steigt?

Klassen sind lazy geladen. Einige Klassen werden nicht benötigt, bis Sie etwas tun.

Soll die Anwendung nicht die vorherigen Klassen verwenden?

Ja, aber das bedeutet nicht, dass es nicht mehr Klassen benötigt.

Warum erhöht es nur fast alles (Heap, Anzahl der geladenen Klassen)? (Bild3)

Ihre Anwendung macht mehr Arbeit.

Wenn Sie wissen möchten, welche Arbeit die Anwendung macht, schlage ich vor, einen Speicherprofiler wie VisualVM oder Flight Recorder zu verwenden. Ich benutze YourKit für diese Art von Fragen.

Hinweis: Es erfordert viel Arbeit, ein Java-Programm so einzustellen, dass es keinen Müll produziert, und ich würde sagen, die meisten Bibliotheken versuchen nur, Müll zu reduzieren, wenn es ein bekanntes Leistungsproblem verursacht.

+0

Danke für Ihre Antwort, ich habe versucht, VisualVM zu verwenden, konnte es aber nicht ausführen. Welcher Profiler ist der Beste, um in Eclipse integriert zu werden? Meine Frage zu VisualVM ist hier http://stackoverflow.com/questions/31064849/visualvm-isunable-to-profile-a-web-application-on-eclipse –

+0

@DanielNewton Ich würde sagen, dass Eclipse und Visual vm sind die dritte favorisierte IDE und Profiler, auf die ich stoße. Wenn ich intellij mit yourkit benutzt habe, hatte ich kein Problem. –

+0

Ich sehe, wie wäre es mit Flight Recorder? –

1

Ich mag @ PeterLawrey gute Antwort, aber das es fehlt:

Der Speicher in erster Linie auf gemeint ist verwendet wird, nicht verschont zu sein. Es kann leicht der Fall sein, dass Ihre Anwendung nur gut geschrieben ist: Es kann mit einem kleinen Speicher arbeiten und es kann alles neu erstellen, das es benötigt, aber es kann auch effizient die Tatsache ausnutzen, dass Ihr System viel Speicher und hat Die Anwendung nutzt den gesamten möglichen Speicher, um viel effizienter zu arbeiten.

Ich kann mir leicht vorstellen, dass die Sache, die den Speicher aufnimmt, zum Beispiel ein Cache ist. Wenn der Cache viele Daten enthält, arbeitet die Anwendung schneller.

Wenn Sie keine Probleme wie OutOfMemoryError haben, müssen Sie sich nicht unbedingt sorgen. Sie sollten immer noch wachsam sein und es weiter untersuchen, aber Ihre beschriebene Situation nicht automatisch bedeuten, dass etwas nicht stimmt.

Es ist analog zu dem ständigen Wehklagen von Windows-Benutzern, dass "Ich mehr Speicher gekauft habe, aber mein Windows alles nutzt" - es ist gut, wenn der Speicher verwendet wird! Dafür kaufen wir es!

Verwandte Themen