Investigação de vazamento de memória da JVM (visual vm)
Vazamento de memória: o fim do uso do objeto, o espaço de memória ocupado pelo objeto não é reciclado durante a coleta de lixo
Explicação: O objeto é referenciado por variáveis de longa duração, como variáveis estáticas
Conseqüências: Se um grande número de objetos for usado, mas não puder ser reciclado, isso poderá causar um estouro de memória (não será possível alocar memória para novos objetos)
***************************
Exemplos
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);
}
}
Nota: Os objetos criados no corpo do loop são adicionados à lista.A lista é uma variável global e o objeto não será liberado após o término da linha do método, causando vazamento de memória.
********************
Saída do console
Parâmetros da máquina virtual: -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)
Descrição: o objeto myObject criado no loop não pode ser liberado, causando estouro de memória
***************************
Investigação visual de vazamento de memória vm
visual gc tags
Durante a operação antes e depois, o espaço usado pela geração antiga aumentou gradualmente e, eventualmente, a memória transbordou, julgando que isso poderia causar um vazamento de memória
sampler: heap dump, execute o heap dump novamente depois de um tempo
Comparação de dois dumps de pilha antes e depois
A comparação constatou que os objetos MyObject aumentaram significativamente
myObject ==》 abre em uma nova aba
Referências myObject
Objetos de vazamento de memória estão na lista vinculada arrayList