[JAVA] Verwendung von VisualVM

Einführung

VisualVM ist ein Tool, mit dem Sie die Java-Speichernutzung überprüfen können. Es wird verwendet, um zu überprüfen, ob bei kontinuierlichen Belastungstests eine Tendenz zu Speicherlecks besteht. Ich denke, es ist kein neues Tool, aber ich denke, es ist immer noch ein aktives Tool, und einige Leute wissen nicht viel darüber. Deshalb habe ich ein Beispielprogramm verwendet, das dazu neigt, Speicher zu verlieren, und es leicht verwendet (soweit ich weiß). Im).

Beispielprogramm

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class MemoryLeak {

	private static class SampleClassA {
		private final List<byte[]> list = new ArrayList<>();

		private void malloc() {
			list.add(new byte[1024]);
		}

		private void clear() {
			list.clear();
		}
	}

	private static class SampleClassB {
		private final List<byte[]> list = new ArrayList<>();

		private void malloc() {
			list.add(new byte[1024]);
		}

		private void clear() {
			;
		}
	}

	public static void main(String[] args) throws Exception {
		SampleClassA sampleA = new SampleClassA();
		SampleClassB sampleB = new SampleClassB();

		while(true) {
			sampleA.malloc();
			sampleB.malloc();
			sampleA.clear();
			sampleB.clear();

			TimeUnit.MILLISECONDS.sleep(100);
		}
	}

}

SampleClass A und Sample Class B weisen alle 100 Millisekunden jeweils 1 KB Speicher zu und geben sie frei. Es sieht fast gleich aus, aber SampleClass B gibt keinen Speicher frei.

Wie benutzt man

Lassen Sie es uns einfach mit dem obigen Beispielprogramm testen.

1. Starten Sie VisualVM

anfangen. In diesem Beispiel verwenden wir VisualVM in Pleiades of Eclipse (unter Windows sollten Sie es mit java / 8 / bin / jvisualvm.exe starten können).

2. Führen Sie das zu testende Programm aus

Führen Sie dieses Mal das obige Beispielprogramm von Eclipse aus. Wenn Sie es ausführen, wird das ausgeführte Programm wie unten gezeigt in VisualVM angezeigt (es wird möglicherweise nicht angezeigt, wenn Sie VisualVM separat von Eclipse herunterladen). image.png Klicken Sie hier, um die aktuelle CPU- und Speicherauslastung anzuzeigen (siehe unten). image.png

3. Notieren Sie den Status zu Beginn des Tests

Notieren Sie es später zum Vergleich mit dem Status zu Beginn des Tests. Machen Sie vorerst nach dem Ausführen von GC über die Registerkarte Überwachung einen Screenshot und zeichnen Sie die aktuelle Speichernutzung auf (blauer Teil ist die aktuelle Speichernutzung). Wenn Sie oben rechts auf der Registerkarte "Überwachung" auf die Schaltfläche "Heap-Dump" klicken, können Sie die aktuell gelesenen Klasseninformationen wie unten gezeigt abrufen. image.png

4. Für eine Weile gehen lassen

Selbst wenn die Speichernutzung vorübergehend zuzunehmen scheint, kann die Erhöhung in der Mitte aufhören. Lassen Sie sie daher für einen bestimmten Zeitraum. In der alten Firma wurde es ungefähr eine Woche lang überwacht, mindestens 3 Tage, aber es hängt davon ab, wie lange der Überwachungszeitraum tatsächlich sein sollte.

5. Vergleichen Sie mit den Ergebnissen nach dem Test

Da es problematisch ist, wird es in ungefähr 2 Stunden abgeschlossen und mit dem Ergebnis vor dem Test verglichen. image.png Die Speichernutzung nach dem Ausführen von GC beträgt ca. 80 MB. Vor dem Test waren es ungefähr 10 MB, sodass Sie sehen können, dass es steigt. Durch den Erwerb eines neuen Heap-Dumps können Sie ihn mit dem vorherigen Heap-Dump vergleichen. Wenn Sie wie zuvor einen Heap-Dump erhalten und oben rechts auf der Registerkarte "Klasse" die Option "Mit einem anderen Heap-Dump vergleichen" auswählen, können Sie sehen, welche Arten von Instanzen wie folgt zunehmen. In diesem Fall nimmt Byte [] zu. image.png Hier können Sie auch herausfinden, wo auf die Instanz verwiesen wird. Doppelklicken Sie im Cluster auf Byte [], klicken Sie links in der Instanz auf das entsprechende Byte und öffnen Sie dann die Referenz unten rechts. Mindestens eine der Byte [] -Instanzen wird in SampleClass B referenziert. Sie können sehen (siehe den Typ Teil). image.png In der Produktion wird von verschiedenen Stellen aus auf verschiedene Instanzen verwiesen. In diesem Fall können Sie jedoch auch dann, wenn Sie die Referenzen anderer Instanzen öffnen, feststellen, dass sie hauptsächlich von SampleClass B referenziert werden.

abschließend

Recommended Posts

Verwendung von VisualVM
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von java.util.stream.Collector
Verwendung von Map
Verwendung der Ketten-API
Verwendung von Java Optional
Verwendung von JUnit (Anfänger)
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse
Wie man Big Decimal benutzt
[Java] Verwendung von removeAll ()
Verwendung von String [] args
Verwendung von Rails Join
Verwendung von Java Map
Verwendung von abhängigen :: zerstören
Verwendung von Eclipse Debug_Shell
Verwendung von Apache POI
Verwendung von Java-Variablen
[Rails] So verwenden Sie authenticate_user!
Verwendung von GC Viewer
Wie man Lombok jetzt benutzt
[Erstellen] Verwendung von JUnit
[Schienen] Verwendung von Scope
Verwendung der link_to-Methode
[Rails] Wie man Edelstein "devise" benutzt
Wie man Lombok im Frühling benutzt
Verwendung von StringBurrer und Arrays.toString.
Verwendung von HttpClient (Get) von Java
Verwendung des Bereichs (JSP & Servlet)
Verwendung der include? -Methode
[Schienen] Verwendung von Geräten (Hinweis)
Verwendung der Methode form_with
[Rails] Verwendung von Flash-Nachrichten
Verwendung von EventBus3 und ThreadMode
Hinweise zur Verwendung von Spring Data JDBC