Übung 1.4: Speicherverlust korrigieren

Bevor Sie mit dieser Übung beginnen, sollten Sie Übung 1.3: Verlustkandidaten analysieren ausgeführt haben.

Jetzt wissen Sie, dass die sekundäre Warteschlange die Verluste verursacht. Lassen Sie uns im Quellcode nach dem Problem suchen.

Gehen Sie wie folgt vor, um die Quelle für die sekundäre Warteschlange zu öffnen und den Speicherverlust zu korrigieren:

  1. Wählen Sie Fenster > Perspektive öffnen > Java aus.
  2. Erweitern Sie im Paket-Explorer die Anzeige für den Eintrag ThreeTierQueue und dann für den Eintrag com.queues.
  3. Klicken Sie doppelt auf den Eintrag SecondaryQueue.java. Die Ansicht mit dem Java-Editor wird geöffnet und zeigt den folgenden Code an:

    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
    		// Objekt exakt einmal abrufen
    		// currentPos protokolliert letztes entferntes Element
    		if(myQ.size()>currentPos){
    			currentPos++;
    			return myQ.get(currentPos-1);
    		}
    	}
    }
    	
  4. Da Sie nach einem Objekt Vector suchen, das an Referenzen auf mehrere String-Objekte festhält, kommt die Methode Object getNext() in Frage.
    In Java sind Vektoren im Allgemeinen Objekt-Arrays. Ein Array dieses Typs kann erweitert werden, um zusätzliche Objekte aufnehmen zu können. Die einzige Begrenzung ist die verfügbare Speicherkapazität. Sie können zu einem Array so lange Objekte hinzufügen, bis der Speicherverbrauch des Arrays zum Absturz der Anwendung führt.
    Erfreulicherweise können Sie auch Objekte aus Vektoren entfernen. Unser Code hat Zeichenfolgenobjekte zum Vektor hinzugefügt, diese jedoch nicht wieder entfernt.
  5. Kopieren Sie die nachfolgende korrigierte Version und fügen Sie sie in der Ansicht mit dem Java-Editor so in Ihre Quelle ein, dass der problembehaftete Code ersetzt wird. In der korrigierten Version wird eine nicht mehr benötigte Zeichenfolge entfernt, um die Vektorgröße in Grenzen zu halten.
    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;
    	}
    }
    	

Ergebnisse prüfen

Wählen Sie im Hauptmenü Datei > Speichern aus, um Ihre Änderungen zu speichern.

Erstellen Sie nun erneut das Anwendungsprofil, indem Sie wie zuvor die Heap-Speicherauszüge erfassen. Wenn Sie die Verlustanalyse durchführen, sehen Sie in der Ansicht der Verlustkandidaten die Nachricht "Die Verlustanalyse hat keine Verlustkandidaten ergeben". Das Leck in der sekundären Warteschlange ist beseitigt und der Algorithmus für Verlustkandidaten hat keine weiteren Lecks gefunden.

Lesen Sie zum Abschluss dieses Lernprogramms die Informationen in der Zusammenfassung.

Nutzungsbedingungen | Feedback
(C) Copyright IBM Corporation 2000, 2005. Alle Rechte vorbehalten.