Exercício 1.4: Corrigindo a Fuga de Memória

Antes de começar, você deve concluir o Exercício 1.3: Analisando os candidatos à fuga.

Agora você sabe que a fila secundária está na fila de fugas. Vamos olhar no código fonte para localizar o problema.

Para abrir a origem da fila secundária e corrigir a fuga de memória:

  1. Selecione Janela > Abrir Perspectiva > Java.
  2. No Explorador de Pacotes, expanda a entrada para ThreeTierQueue e, em seguida, a entrada para com.queues.
  3. Dê um clique duplo na entrada para SecondaryQueue.java. A visualização do Editor Java é aberta e exibe o seguinte código:

    public class SecondaryQueue {
    	private Vector myQ;
    	private int currentPos;
    	public SecondaryQueue(){
    		myQ = new Vector();
    		currentPos=0;
    	}
    	public void add(Object obj){
    		myQ.add(obj);
    	}
    	public Object getNext(){
    		// First In First Out.
    		// Get an object exactly once, 
    		// currentPos keeps track of last item removed.
    		if(myQ.size()>currentPos){
    			currentPos++;
    			return myQ.get(currentPos-1);
    		}
    	}
    }
    	
  4. Lembrando-se de que você está procurando por um objeto Vector que está mantendo referências a muitos objetos String, considere o método Object getNext().
    No Java, os vetores normalmente são matrizes de objetos. Uma matriz desse tipo, quando fica cheia, pode ser expandida para acomodar objetos adicionais. O único limite é a quantidade de memória disponível. É possível incluir objetos em uma matriz até que ela utilize tanta memória que cause o travamento do aplicativo.
    Felizmente, também é possível remover objetos de vetores. Nosso código foi incluindo objetos de cadeia no vetor, mas negligenciou sua remoção.
  5. Copie a versão corrigida fornecida abaixo e cole-a na origem na visualização Editor Java, substituindo o código problemático. Esta versão mantém o tamanho do vetor dentro dos limites removendo uma cadeia quando ela não mais é necessária.
    public class SecondaryQueue {
    	private Vector myQ;
    	private int currentPos;
    	public SecondaryQueue(){
    		myQ = new Vector();
    		currentPos=0;
    	}
    	public void add(Object obj){
    		myQ.add(obj);
    	}
    	public Object getNext(){
    		if(myQ.size()>0){
    			return myQ.remove(0);
    		}
    		return null;
    	}
    }
    	

Verificando os Resultados

No menu principal, selecione Arquivo > Salvar para salvar as alterações.

Agora crie o perfil do aplicativo novamente, capturando dumps de heap exatamente como antes. Ao analisar por fugas, a visualização Candidatos à Fuga informa que "A Análise de Fuga não resultou em nenhum candidato à fuga." Você corrigiu a fuga na fila secundária e o algoritmo de Candidatos à Fuga não localizou fugas adicionais.

Conclua este tutorial revisando os materiais no Sumário.

Termos de uso | Feedback
(C) Copyright IBM Corporation 2000, 2005. Todos os Direitos Reservados.