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).
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.
Testons-le facilement en utilisant l'exemple de programme ci-dessus.
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).
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). Cliquez dessus pour voir l'utilisation actuelle du processeur et l'utilisation de la mémoire comme indiqué ci-dessous.
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.
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.
Puisqu'il est gênant, il sera terminé en environ 2 heures et comparé au résultat avant le test. 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. 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). 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.
Recommended Posts