Ejercicio 1.4: Arreglo de fugas de memoria

Antes de empezar, complete el Ejercicio 1.3: Análisis de posibles fugas.

Ahora ya sabe que la cola secundaria es la cola que se está fugando. Echemos un vistazo al código fuente para encontrar el problema.

Para abrir el origen de la cola secundaria y arreglar la fuga de memoria:

  1. Pulse Ventana > Abrir perspectiva > Java.
  2. En el Explorador de paquetes, expanda la entrada ThreeTierQueue y, a continuación, com.queues.
  3. Efectúe una doble pulsación en la entrada SecondaryQueue.java. Se abre el editor Java, en el que se muestra el código siguiente:

    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. Teniendo presente que está buscando un objeto Vector que retiene referencias a muchos objetos String, considere la posibilidad de utilizar el método Object getNext().
    En Java, los vectores, normalmente, son matrices de los objetos. Una matriz de este tipo, cuando se llena, puede expandirse para que puedan caber objetos adicionales. El único límite es la cantidad de memoria disponible. Es posible añadir objetos a una matriz hasta que ésta utilice tanta memoria que la aplicación se bloquee.
    Afortunadamente, también puede eliminar objetos de los vectores. Nuestro código ha estado añadiendo objetos de cadena de caracteres al vector, pero se ha olvidado de eliminarlos.
  5. Copie la versión corregida proporcionada más abajo y cópiela en el origen correspondiente, en la vista Editor Java, reemplazando el código problemático. Esta versión conserva el tamaño del vector dentro de los límites eliminando una cadena de caracteres cuando ésta ya no es necesaria.
    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;
    	}
    }
    	

Verificación de los resultados

En el menú principal, pulsa Archivo > Guardar para guardar los cambios.

Vuelva a crear el perfil de la aplicación, capturando los vuelcos de almacenamiento dinámico tal como lo ha hecho antes. Cuando efectúe el análisis en busca de fugas, en la vista Posibles fugas aparecerá el mensaje "El resultado de Análisis de fugas no dio como resultado ninguna posible fuga". Ha arreglado la fuga en la cola secundaria, y el algoritmo Posibles fugas no ha encontrado ninguna fuga adicional.

Finalice esta guía de aprendizaje revisando los materiales de la sección Resumen.

Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.