Esercizio 1.4: Risoluzione della perdita di dati di memoria

Prima di iniziare, è necessario completare l'Esercizio 1.3: Probabili perdite di dati.

A questo punto si è appreso che la coda secondaria è la coda con la perdita di dati. Controllare il codice di origine per individuare il problema.

Per aprire l'origine per la coda secondaria e risolvere la perdita di dati di memoria:

  1. Selezionare Finestra > Apri prospettiva > Java.
  2. In Esplora pacchetti, espandere la voce ThreeTierQueue, quindi la voce com.queues.
  3. Fare doppio clic sulla voce SecondaryQueue.java. Viene visualizzata la vista Editor Java e viene visualizzato il seguente codice:

    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. Ricordare che si sta cercando un oggetto Vector che conserva riferimenti a molti oggetti String, considerare il metodo Object getNext().
    In Java, i vettori sono comunemente delle matrice di oggetti. Una matrice di questo tipo, quando viene riempita, si può espandere per fare spazio ad ulteriori oggetti. L'unico limite è la quantità di memoria disponibile. È possibile aggiungere oggetti ad una matrice fino a quando la matrice utilizza una quantità tale di memoria fino all'interruzione dell'applicazione.
    Fortunatamente, è anche possibile rimuovere oggetti dai vettori. Il codice stava aggiungendo oggetti di tipo stringa al vettore, omettendone la rimozione.
  5. Copiare la versione corretta riportata di seguito e incollarla nell'origine in uso nella vista Editor Java, sostituendo il codice problematico. Tale versione mantiene le dimensioni del vettore entro i limiti rimuovendo una stringa qualora non fosse più necessaria.
    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;
    	}
    }
    	

Verifica dei risultati

Nel menu principale, selezionare File > Salva per salvare le modifiche.

Ora, creare nuovamente il profilo dell'applicazione, catturando i dump di heap come in precedenza. Quando si analizzano le perdite di dati di memoria, la vista Probabili perdite di dati indicherà che "L'analisi di perdita di dati non è risultata in nessuna probabile perdita di dati". La perdita di dati è stata risolta nella coda secondaria e l'algoritmo Probabili perdite di memoria non ha trovato ulteriori perdite di memoria.

Terminare questa esercitazione esaminando il materiale nel Sommario.

Terminologia | Feedback
(C) Copyright IBM Corporation 2000, 2005. Tutti i diritti riservati.