Effective Java | #7. 다 쓴 객체 참조를 해제하라

보람·2022년 5월 8일
0

Effective-Java

목록 보기
8/25

메모리 누수의 주범 3가지

스택 pop 메모리 누수

public Object pop() {
	if (size == 0)
    	throw new EmptyStackException();
    return elements[--size];
}
  • 스택이 커졌다가 줄어들었을 때(pop에서) 스택에서 꺼내진 객체들을 더이상 사용하지 않음에도 가비지 컬렉터가 회수하지 않는다.

null 처리(참조 해제)

public Object pop() {
    if (size == 0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; // 다 쓴 참조 해제
    return result;
}
  • null처리를 통해 참조를 해제할 수 있고
  • 해당 값을 실수로 다시 호출하는 경우를 예방할 수 있다.
  • 객체 참조를 null 처리하는 일은 예외적인 경우여야 한다.
    • 스택은 자기 메모리를 직접 관리하기 때문에 메모리 누수에 약함
    • 스택과 같이 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다.

캐시

  • 캐시 또한 메모리 누수를 일으킨다.
  • 해법
    • WeakHashMap : 엔트리의 사용 기간이 정해져 있는 경우 사용 가능
    • 시간이 흘러 사용하지 않는 엔트리 청소

리스너(or 콜백)

  • weak reference 로 콜백을 저장하면 가비지 컬렉터가 즉시 수거해간다.

핵심 정리

메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다. 이런 누수는 철저한 코드 리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도 한다. 그래서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다.

profile
백엔드 개발자

0개의 댓글