[JAVA] Comment utiliser VisualVM

introduction

VisualVM est un outil qui vous permet de vérifier l'utilisation de la mémoire Java. Il est utilisé pour vérifier s'il existe une tendance aux fuites de mémoire lors de la réalisation de tests de charge continue. Je pense que ce n'est pas un nouvel outil, mais je pense que c'est toujours un outil actif, et certaines personnes ne savent pas grand-chose à ce sujet, alors j'ai utilisé un exemple de programme qui a tendance à fuir de la mémoire et je l'ai utilisé facilement (pour autant que je sache). Dans).

Exemple de programme

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 et Sample Class B allouent et libèrent chacun 1 Ko de mémoire toutes les 100 millisecondes. Cela a presque le même aspect, mais SampleClass B ne libère pas réellement de mémoire.

Comment utiliser

Testons-le facilement en utilisant l'exemple de programme ci-dessus.

1. Démarrez VisualVM

commencer. Dans cet exemple, nous utilisons VisualVM dans Pleiades of Eclipse (sous Windows, vous devriez pouvoir le démarrer avec java / 8 / bin / jvisualvm.exe).

2. Exécutez le programme que vous souhaitez tester

Cette fois, exécutez l'exemple de programme ci-dessus à partir d'Eclipse. Lorsque vous l'exécutez, le programme en cours d'exécution apparaîtra dans VisualVM comme indiqué ci-dessous (il peut ne pas apparaître si vous téléchargez VisualVM séparément d'Eclipse). image.png Cliquez dessus pour voir l'utilisation actuelle du processeur et l'utilisation de la mémoire comme indiqué ci-dessous. image.png

3. Enregistrez l'état au début du test

Enregistrez-le plus tard pour comparaison avec l'état au début du test. Pour le moment, après avoir exécuté GC à partir de l'onglet de surveillance, prenez une capture d'écran et enregistrez l'utilisation actuelle de la mémoire (la partie bleue correspond à l'utilisation actuelle de la mémoire). De plus, si vous appuyez sur le bouton de vidage du tas en haut à droite de l'onglet de surveillance, vous pouvez obtenir les informations de classe en cours de lecture, comme indiqué ci-dessous. image.png

4. Laisser un moment

Même s'il semble que l'utilisation de la mémoire augmente temporairement, il semble que l'augmentation puisse s'arrêter au milieu, alors laissez-la pendant un certain temps. Dans l'ancienne entreprise, il était surveillé pendant environ une semaine, au moins 3 jours, mais cela dépend de la durée de la période de surveillance.

5. Comparer avec les résultats post-test

Puisqu'il est gênant, il sera terminé en environ 2 heures et comparé au résultat avant le test. image.png L'utilisation de la mémoire après l'exécution de GC est d'environ 80 Mo. Avant le test, il était d'environ 10 Mo, vous pouvez donc voir qu'il augmente. En acquérant un nouveau vidage de tas, vous pouvez le comparer avec le vidage de tas précédent. Si vous obtenez un vidage de tas comme précédemment et sélectionnez Comparer avec un autre vidage de tas dans le coin supérieur droit de l'onglet de classe, vous pouvez voir quels types d'instances augmentent comme suit. Dans ce cas, l'octet [] augmente. image.png Vous pouvez également savoir où l'instance est référencée ici. Double-cliquez sur l'octet [] dans le cluster, cliquez sur celui qui convient dans l'instance sur la gauche, puis ouvrez la référence en bas à droite. Au moins une des instances d'octet [] est référencée à partir de SampleClass B. Vous pouvez voir (voir la partie type). image.png En production, diverses instances sont référencées à partir de différents endroits, mais dans ce cas, même si vous ouvrez les références d'autres instances, vous pouvez voir qu'elles sont principalement référencées à partir de SampleClass B.

en conclusion

Recommended Posts

Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser java.util.stream.Collector
Comment utiliser Map
Comment utiliser l'API Chain
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser la classe Java
Comment utiliser Big Decimal
[Java] Comment utiliser removeAll ()
Comment utiliser String [] args
Comment utiliser la jonction de rails
Comment utiliser Java Map
Comment utiliser Dependant :: Destroy
Comment utiliser Eclipse Debug_Shell
Comment utiliser Apache POI
Comment utiliser les variables Java
[Rails] Comment utiliser authenticate_user!
Comment utiliser GC Viewer
Comment utiliser Lombok maintenant
[Création] Comment utiliser JUnit
[Rails] Comment utiliser Scope
Comment utiliser la méthode link_to
[Rails] Comment utiliser la "devise" des gemmes
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser HttpClient de Java (Get)
Comment utiliser scope (JSP & Servlet)
Comment utiliser la méthode include?
[Rails] Comment utiliser l'appareil (Remarque)
Comment utiliser la méthode form_with
[Rails] Comment utiliser les messages flash
Comment utiliser EventBus3 et ThreadMode
Remarques sur l'utilisation de Spring Data JDBC