티스토리 뷰

반응형

다 쓴 객체 참조를 해제하라

자바에서는 기존 managed 언어(C/C++)과 다르게 GC를 갖춰 프로그래머가 메모리에 신경을 덜 써도 됐다.
하지만 모든 메모리누수가 사라진 것은 아니다.

public class Stack { 
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() { 
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object e) { 
        ensureCapacity();
        elements[size++] = e;
    }
    public Object pop() { 
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }
    /** * 원소를 위한 공간을 적어도 하나 이상 확보한다.
    * 배열 크기를 늘려야 할 때마다 대략 두 배씩 늘린다.
    */ 
    private void ensureCapacity() { 
        if (elements.length == size) 
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

다음 소스코드에서 메모리 누수가 나는 곳을 찾아보자.
pop의 메서드 안에서 다쓴 Object를 GC는 회수하지 않는다. GC는 자신을 참조하는 모든 객체들이 해제 되었을때 그 객체를 메모리에서 회수하게 된다.
하지만 이 코드에서는 elements에서 size만 줄였을 뿐 생성된 객체에 있어서는 참조를 해제한 적이 없다.

public Object pop() { 
    if (size == 0) 
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; // 다 쓴 참조 해제
    return result;
}

위와 같이 꼭 버려지는 object에 대해서 참조를 해제 해주어야만 GC에서 객체를 회수해 갈 수 있다.
하지만 책에서는 null처리를 남용할 경우에는 프로그램을 필요 이상으로 지저분하게 만든다고 추천하지 않는다.
근본적으로 위의 Stack클래스에서는 자기 메모리를 직접 관리하고 있다.

elements 배열로 저장소 풀을 만들어 관리하기 때문이다.

728x90
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
250x250