자바는 가비지컬랙션이 알아서 메모리를 회수해 주는데 이게 만능이 아니다.
아래 코드를 보자.

 import java.util.*;

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];
    }

    /**
     * Ensure space for at least one more element, roughly
     * doubling the capacity each time the array needs to grow.
     */
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}


저걸 보면 메모리 누수가 생기는 부분을 찾을 수 있다 어디냐면 pop() 부부인데
elements를 꺼네오고 나서 아무런 행동을 하지 않기 때문에 해당 공간은 메모리에 그대로 남아있게 되고
그러다보면 프로그램이 메모리 부족으로 죽을 수 도 있다.

그래서 저 부분을 이렇게 수정해주어야 한다.

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result =  elements[--size];
        elements[size] = null;
        return result;
    }
이렇게 하면 필요없는 참조를 null로 만들게 되어 가비지컬랙션이 해당 부분의 메모리를 수거해 간다.

매모리 누출이 흔히 생기는 이유는 객체 참조를 놔눠서 생기는 부분 말구 또 따른 이유는 캐시이다. 객체 참조를 캐시에 저장하면 저장했다는 것을 잊어버리고 객체가 더 이상 필요 없을 때 까지 캐시에 내벼려 두기 쉽다. 그리고 마지막으로 리스너와 콜백을 사용할 경우 매모리 누수가 발생할 수 있다.
Posted by 서오석
,