Investigação de vazamento de memória da JVM (visual vm)


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

 

 

Publicado 387 artigos originais · Gosto 98 · Visitas com mais de 30.000

Acho que você gosta

Origin blog.csdn.net/weixin_43931625/article/details/105241467
Recomendado
Clasificación