
134
1
부
-
기초
그림
6-10
태스크 메시지를 발송할 때의 객체 참조 트리
Thread
Message
RunnableHandler
Outer Sample
Object
GC 루트 객체
객체
6.3
메모리 누수 방지
앞에서 언급한 바와 같이 스레드와 연루된 대부분의 메모리 누수는 필요 이상으로 오래 메모리
에 남아 있는 객체에 의해 발생한다. 스레드와 핸들러는 더 이상 사용하지 않는 경우에도 객체가
스레드
GC
루트에서 도달 가능하게 유지할 수 있다. 이러한 메모리 누수를 피하거나 완화하는
방법을 살펴보자.
6.3.1
정적 내부 클래스 사용
지역 클래스, 내부 클래스, 익명 내부 클래스 모두 그것들이 선언된 외부 클래스로 암시적 참조
를 유지한다. 따라서 자신의 객체뿐만 아니라 외부 클래스로부터 참조된 것도 누수될 수 있다.
일반적으로 액티비티와 액티비티의 뷰 계층 구조는 외부 클래스 참조를 통해 주요한 누수의 원
인이 될 수 있다.
외부 클래스 참조로 중첩 클래스를 사용하는 대신, 정적 내부 클래스를 사용하는 것이 바람직하
다. 이는 정적 내부 클래스가 인스턴스 객체가 아닌 오직 전역 클래스 객체에 의해 참조되기 때
문이다. 정적 내부 클래스에서 다른 인스턴스 객체로의 모든 명시적 참조는 누수를 완화하는데,
스레드가 실행되는 동안에는 모든 명시적 참조가 여전히 살아 있기