Enquête sur les fuites de mémoire JVM (Visual VM)


Enquête sur les fuites de mémoire JVM (Visual VM)

 

Fuite de mémoire: à la fin de l'utilisation de l'objet, l'espace mémoire occupé par l'objet n'est pas recyclé lors de la récupération de place

Cause: l' objet est référencé par des variables à longue durée de vie, telles que des variables statiques

Conséquences: si un grand nombre d'objets sont utilisés mais ne peuvent pas être recyclés, cela peut provoquer un débordement de mémoire (impossible d'allouer de la mémoire pour de nouveaux objets)

 

 

***************************

Des exemples

 

class MyObject{

    private int _1m=1024*1024;
    private byte[] b;

    public MyObject(){
        this.b=new byte[_1m];
    }
}

public class Test11 {

    private static List<MyObject> list=new ArrayList<>();

    public static void main(String[] args) throws Exception {
        for (int i=0;i<1000;i++){
            list.add(new MyObject());
            System.out.println("add "+i);

            try{
                Thread.sleep(1000);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        System.out.println(list);
    }
}

Remarque: Les objets créés dans le corps de la boucle sont ajoutés à la liste. La liste est une variable globale et l'objet ne sera pas libéré après la fin de la ligne de méthode, provoquant une fuite de mémoire

 

********************

Sortie console

 

Paramètres de la machine virtuelle: -Xms500m -Xmx500m

。。。
add 240
add 241
add 242
add 243
add 244
add 245
add 246
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at runtime.MyObject.<init>(Test11.java:12)
	at runtime.Test11.main(Test11.java:22)

Description: l'objet myObject créé dans la boucle ne peut pas être libéré, provoquant un dépassement de mémoire

 

 

***************************

Enquête visuelle de fuite de mémoire de VM

 

balises gc visuelles

      

      

Au cours de l'opération avant et après, l'espace utilisé par l'ancienne génération a progressivement augmenté, et finalement la mémoire a débordé, jugeant qu'elle peut provoquer une fuite de mémoire

 

échantillonneur: vidage de tas, réexécutez le vidage de tas après un certain temps

      

 

Comparaison de deux vidages de tas avant et après

      

      

La comparaison a révélé que les objets MyObject ont augmenté de manière significative

 

myObject ==》 ouvrir dans un nouvel onglet

       

 

Références myObject

      

Les objets de fuite de mémoire sont dans la liste liée arrayList

 

 

Publié 387 articles originaux · Comme 98 · Visites 30 000+

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43931625/article/details/105241467
conseillé
Classement