演習 1.4: メモリー・リークの修正

始める前に、『演習 1.3: リーク候補の分析』を完了する必要があります。

2 次キューがリークしているキューだということが分かりました。ソース・コードを見て問題を検出します。

2 次キューのソースを開いてメモリー・リークを修正するには以下を行います。

  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(){
    		// 先入先出 (FIFO)。
    		// オブジェクトを 1 度正しく取得し、
      		// currentPos が最後に除去された項目の追跡を保持します。
    		if(myQ.size()>currentPos){
    			currentPos++;
    			return myQ.get(currentPos-1);
    		}
    	}
    }
    	
  4. 探している Vector オブジェクトが、多くの String オブジェクトへの参照を保持していることを考慮して、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;
    	}
    }
    	

結果の検査

メインメニューから「ファイル」>「保管」を選択して、変更を保管します。

前回と同様にヒープ・ダンプを取得して、アプリケーションのプロファイルを作成します。 リークを分析すると、「リーク候補」ビューに「リーク分析の結果、リーク候補は見つかりませんでした」と表示されます。2 次キューのリークは修正され、リーク候補アルゴリズムによって追加のリークは検出されませんでした。

要約』に記載されている資料を確認してチュートリアルを完了します。

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005