2011. 11. 6. 17:06

Context 메모리 릭 관련

Context 에는 두가지 종류가 있습니다. 하나는 Application 이고 하나는 Activity 입니다.

Activity 의 경우 Orientation 이 바뀌는 경우에도 소멸되고, 다시 생성됩니다. 이때 이전의 Activity Context 를 static 변수가 만일 참조하고 있다면 Activity 가 GC에 의해 소멸되지 않을 것입니다.

이렇게 Context 관련해서 참조를 해야 하는 경우는 Activity 보다는 Application Context 를 참조해야 합니다.

컨텍스트 관련 메모리 릭을 피하는 방법은 다음과 같습니다.

 * Activity Context 를 참조하는 경우, Activity 라이프 사이클과 동일해야 합니다. 
 * context-activity 대신 context-application 을 사용하세요
 * 중첩클래스(inner class)의 라이프 사이클을 제어하지 않는다면, activity 내에 비정적 중첩 클래스(non-static inner class)를 사용하지 마세요. 정적 중첩 클래스를 사용하고 내부적으로 activity 에 대한 약한 참조(weak reference)를 사용하세요. 이 이슈에 대한 해결책은 외부 클래스(outer class)에 대한 약한참조를 가지는 정적 중첩 클래스를 사용하는 것입니다, 이에 대한 예로 ViewRoot 안에 W 중첩 클래스가 그렇게 구현되어 있습니다.
 * Garbage Collector 가 메모리 릭 방지를 보장해 주지는 않습니다.
출처: http://developer.android.com/resources/articles/avoiding-memory-leaks.html