← 질문 목록
#92깊이 0
화면이 닫혔는데 객체가 남는 이유는?
정적 필드와 싱글턴과 실행 중 스레드 같은 긴 수명의 객체가 Activity나 View를 계속 참조하기 때문이다. GC Root에서 도달 가능하면 수집되지 않는다.
- GC Root정적 필드나 실행 중 스레드다
- 싱글턴·콜백화면 객체를 참조한다
- Activity·View종료돼도 도달 가능하다
리스너를 등록한 수명에서 해제하고 코루틴과 콜백도 함께 취소한다. UI가 필요 없는 객체에는 Application Context를 사용한다.
ViewModel에는 Activity나 View 참조를 두지 않는다. Fragment의 뷰 바인딩은 onDestroyView에서 비워 뷰 수명과 맞춘다.
힙 덤프에서 누수 객체의 GC Root 경로를 따라간다. 지배 참조를 끊은 뒤 같은 화면을 반복 열고 보유 개수가 줄어드는지 확인한다.
추천 꼬리질문
관련 질문
- 참조 횟수가 0이 아닌 객체도 왜 수거되는가?언어 · 런타임둘러싸인 참조로 인해 참조 횟수가 0이 아닌 객체가 수거되는 원리(GC)는 객체가 남는 이유를 분석하는 밑바탕 개념이다.
- 뷰 바인딩은 왜 onDestroyView에서 비우는가?모바일뷰 바인딩 객체를 onDestroyView에서 해제하지 않아 객체가 남는 것은 화면 닫힘 후 객체 잔존의 구체적인 사례다.
- 자동 참조 계산인데 왜 메모리가 남는가?모바일둘 다 객체가 메모리에 남아서 수거되지 않는 메모리 관리 및 참조 관계 문제를 다룬다.
- 안드로이드에서 메모리 누수가 발생하는 주원인은 무엇인가?모바일둘 다 모바일 환경에서 화면 종료 후에도 객체가 메모리에 남아 발생하는 메모리 누수 문제를 다룬다.
- 순환 참조 객체도 회수할 수 있는 이유는?언어 · 런타임객체가 남는 이유를 이해하기 위해서는 순환 참조와 같은 메모리 회수 불능 상태에 대한 이해가 필요하다.