연습 1.4: 메모리 누수 해결

시작하기 전에 연습 1.3: 누수 후보 분석을 완료해야 합니다.

이제 2차 큐가 누수되는 큐임을 알았습니다. 소스 코드를 확인하여 문제점을 찾아보겠습니다.

2차 큐의 소스를 열고 메모리 누수를 수정하려면 다음을 수행하십시오.

  1. 창 > Perspective 열기 > 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;
    	}
    }
    	

결과 확인

기본 메뉴에서 파일 > 저장을 선택하여 변경 내용을 저장하십시오.

전과 같이 힙 덤프를 캡처하여 어플리케이션을 다시 프로파일링하십시오. 누수를 분석할 때 누수 후보 보기에 "누수 분석 결과, 누수 후보가 없습니다."가 표시됩니다. 2차 큐의 누수를 해결했으며 누수 후보 알고리즘이 추가 누수를 발견하지 않았습니다.

요약에 있는 내용을 검토하여 이 학습을 완료하십시오.

사용 약관 | 피드백
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.