実習 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(){
    		// 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. 探しているものは、多くの 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;
    	}
    }
    	

修正結果の検証

メインメニューから、「ファイル」>「保管」を順にクリックして変更を保存します。

アプリケーションのプロファイルを再度作成して、以前と同様にヒープ・ダンプをキャプチャーします。 リークを分析すると、「リーク分析によるリーク候補は見つかりませんでした (Leak Analysis did not result in any leak candidates)」という通知が「リーク候補 (Leak Candidates)」ビューに表示されます。セカンダリー・キューに存在していたリークが修正され、「リーク候補 (Leak Candidates)」のアルゴリズムでは追加のリークは検出されませんでした。

要約の記事を検討して、このチュートリアルを終了します。

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.