练习 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;
    	}
    }
    	

验证结果

从主菜单中,选择文件 > 保存以保存更改。

现在再次概要分析应用程序,和以前一样捕获堆转储。 分析泄漏时,“疑似泄漏对象”视图告诉您“泄漏分析没有发现任何疑似泄漏对象。” 您已在第二级队列中修正泄漏,并且“疑似泄漏对象”算法没发现任何其它泄漏。

复习摘要中的资料,完成教程。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.