Exercice 1.4 : Correction de la fuite de mémoire

Avant de commencer, vous devez terminer l'Exercice 1.3 : Analyse des candidats de fuite.

Vous savez maintenant que la file d'attente secondaire est celle qui présente des fuites. Examinez le code source pour identifier l'origine de l'incident.

Pour ouvrir la source de la file d'attente secondaire et corriger la fuite de mémoire :

  1. Sélectionnez Fenêtre > Ouvrir la perspective > Java.
  2. Dans la vue Packages, développez l'entrée ThreeTierQueue, puis l'entrée com.queues.
  3. Cliquez deux fois sur l'entrée SecondaryQueue.java. La vue Java Editor s'ouvre et affiche le code suivant:

    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. Sachant que vous recherchez un objet Vector qui contient de nombreuses références à des objets String, examinez la méthode Object getNext().
    Dans Java, les vecteurs sont généralement des matrices d'objets. Lorsqu'elle se remplit, une matrice de ce type peut être étendue pour prendre en compte des objets supplémentaires. La seule limite est le volume de mémoire disponible. Vous pouvez ajouter des objets à une matrice tant que la mémoire utilisée par celle-ci ne provoque pas une panne de l'application.
    Vous pouvez aussi supprimer des objets des vecteurs. Le code défini permet d'ajouter des objets au vecteur mais il n'a pas prévu leur suppression.
  5. Copiez la version corrigée ci-dessous et collez-la dans votre source dans la vue Java Editor pour remplacer le code qui pose problème. Cette version conserve la taille maximale autorisée pour le vecteur en supprimant une chaîne qui n'est plus nécessaire.
    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;
    	}
    }
    	

Vérification de vos résultats

Dans le menu principal, sélectionnez Fichier > Sauvegarder pour enregistrer vos modifications.

Ensuite, profilez à nouveau l'application en capturant les vidages de tas comme indiqué précédemment. Lorsque vous recherchez les fuites, la vue Candidats de fuite indique que "L'analyse de fuite n'a trouvé aucun candidat de fuite." Vous avez corrigé la fuite de la file d'attente secondaire et l'algorithme de détection de fuite n'a détecté aucune autre fuite.

Terminez ce tutoriel en passant en revue les objectifs de formation, dans la section Résumé.

Conditions d'utilisation | Appréciations en retour
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.