練習 1.4:修正記憶體洩漏

開始之前,您必須先完成練習 1.3:分析洩漏候選項

現在您知道第二個佇列是發生洩漏的佇列。讓我們再看看程式碼來尋找問題。

若要開啟第二個佇列的程式碼並修正記憶體洩漏:

  1. 按一下視窗 > 開啟視景 > Java
  2. 在「套件瀏覽器」中,展開 ThreeTierQueue 項目,再展開 com.queues 項目。
  3. 按兩下 SecondaryQueue.java 項目。 這時會開啟「Java 編輯器」並顯示下列程式碼:

    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(){
    		// 先進先出。
    		// 只取得物件一次,
    		// currentPos 追蹤移除的最後一個項目。
    		if(myQ.size()>currentPos){
    			currentPos++;
    			return myQ.get(currentPos-1);
    		}
    	}
    }
    	
  4. 請記得您是在尋找保存許多 String 物件參照的 Vector 物件,請考慮 Object getNext() 方法。
    在 Java 中,向量通常是物件的陣列。這種陣列類型,當填滿時,可以擴充以容納其他的物件。唯一的限制是可用記憶體的數量。所以可以新增物件到陣列,直到陣列使用的記憶體數量足以讓您的應用程式當機。
    幸好,您也可以從向量移除物件。我們的程式碼已將字串物件新增到向量,但是因為疏忽而未移除它們。
  5. 將以下提供的更正版本複製並貼到「Java 編輯器」視圖中的程式碼,取代有問題的程式碼。這個版本會在字串不需要再使用時將該字串移除,將向量大小保持在限制之內。
    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;
    	}
    }
    	

驗證您的結果

在主功能表中,按一下檔案 > 儲存來儲存您的變更。

現在再一次側寫應用程式,依照之前的方法來擷取資料堆傾出。當您分析洩漏時,「洩漏候選項」視圖會告訴您「分析洩漏未產生任何的洩漏候選項」。您已修正第二個佇列中的洩漏,「洩漏候選項」演算法未發現任何其他的洩漏。

請檢視摘要中的資料來完成這個指導教學。

讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.