///
Search
💡

item 7. 다 쓴 객체 참조를 해제하라 Eleminate obsolete object references

가비지 컬렉터

자바는 가비지 컬렉터(Garbage Collector, GC)를 활용한다. 메모리를 직접 청소하지 않아도 되니까 개발자는 행복하다. 하지만 GC의 원리를 살펴보면, GC는 참조하지 않는 객체(unreachble object)들을 수거해간다.
하지만 이 참조가 해제되지 않으면 GC가 해당 메모리를 수거대상이라고 인식하지 못한다. 이렇게 사용하지 않는 객체가 쌓이고 쌓이다보면 로직에선 사용되지 않는 메모리로 인해 프로그램 성능이 영향을 받게 되는데, 이를 메모리 누수 라고 한다.

메모리 누수가 발생할 수 있는 상황

1.
자기 메모리를 직접 관리하는 클래스
자체 구현한 자료구조 혹은 객체 배열을 활용하는 경우, 로직 상 비활성 영역(더 이상 사용하지 않는 영역)인데 참조는 해제되지 않는 경우가 있다. 이 때는null할당을 통해 해결할 수 있다.

null 할당...?

객체 참조를 null 할당하는 경우는 가급적 피해야 한다! null은 NPE를 일으키는 주범이고, 객체가 자기 역할을 하지 못하게 막는다. 위 상황처럼 '메모리 누수를 막기 위해' 같은 명확한 이유가 있는 경우만 사용하자.
2.
캐시
객체 참조를 캐시에 넣어놓고 까맣게 잊으면, 캐시 역시 메모리 누수의 범인이 된다. 해법은 여러가지인데, Key를 참조하는 동안(value가 아니다)만 엔트리가 살아있는 캐시가 필요한 상황이면 WeakHashMap을 활용할 수 있다. 혹은 백그라운드 스레드에서 사용하지 않는 엔트리를 청소해주거나, 새 엔트리를 추가할 때 부수작업으로 수행할 수 도 있다.
3.
리스너, 콜백
클라이언트가 콜백을 등록만 하고 명확히 해지하지 않으면 콜백은 계속해서 쌓여간다. 이 때 콜백을 약한 참조로 등록해 두면 GC가 즉시 수거해가는데, WeakHashMap의 key로 저장하는 식이다.

용어정리

한글명
영어명
메모리 누수
memory leak
그 후
subsequently
대신
rather than
표준
norm
느끼기 쉬운
susceptible
명시적으로
explicitly
예상하다
anticipate