이펙티브 자바 아이템7 정리

이창호·2022년 4월 25일
0

이펙티브자바

목록 보기
9/12

다 쓴 객체 참조를 해제하라

다 쓴 참조(obsolete reference)

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() 메서드로 참조하는 size가 줄어들게 되면 앞으로는 다시 쓰이지 않게 된다.
  • 하지만 GC는 이것을 알아차리지 못하고 회수하지 않는다.
  • 이것을 다 쓴 참조(obsolete reference)라 한다.

다 쓴 참조(obsolete reference) 해결 방법

    public Object safePop() {
        if(size == 0) {
            throw new EmptyStackException();
        }
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }
  • 이제 스택에서 아이템을 꺼내면 기존에 element를 null로 처리하여 참조 해제하면 된다.

더 나은 참조 해제 방법

  • null로 처리하는 것은 예외적인 경우여야 한다.
  • 가장 좋은 방법은 그 참조를 담은 변수를 유효 범위(scope) 밖으로 밀어내는 것이다.

java.lang.ref 패키지를 활용해 캐시를 만들어라

리스너 혹인 콜백을 등록하고 해지해야 한다.

  • 콜백을 약한 참조(weak reference)로 저장하면 GC가 즉지 수거해간다.
  • WeakHashMap 키로 저장하면 된다.

참고하면 좋은 글

https://jyami.tistory.com/62
https://d2.naver.com/helloworld/329631

profile
이타적인 기회주의자

0개의 댓글