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