← 질문 목록
#269깊이 0
안드로이드에서 메모리 누수가 발생하는 주원인은 무엇인가?
활동(Activity)이 파괴되었음에도 외부 객체에 의해 참조가 유지되어 가비지 컬렉터가 회수하지 못할 때 발생한다.
GC Root
여기서 닿는 것은 걷지 않는다
오래 사는 바깥 객체
핸들러나 비동기 작업이 흔한 자리다
익명 클래스
바깥 클래스를 숨은 참조로 붙잡는다
Activity
파괴됐는데도 이 사슬에 매달려 남는다
가장 흔한 사례는 Activity 내부에서 익명 클래스나 내부 클래스를 사용하는 경우다. 이들은 외부 클래스에 대한 숨은 참조를 가지므로, 내부 클래스가 살아있으면 Activity도 메모리에 남는다.
특히 핸들러(Handler)나 비동기 작업이 Activity보다 오래 실행될 때 위험하다. 작업이 끝나기 전까지 Activity 참조를 붙잡고 있어 누수가 발생한다.
먼저 화면보다 오래 사는 작업과 콜백을 수명에 맞춰 끊는다. 그래도 남는 자리에만 정적 중첩 클래스나 약한 참조를 쓴다. 또한 Activity 생명주기에 맞춰 등록한 리스너를 명시적으로 해제해야 한다.
추천 꼬리질문
관련 질문
- 뷰 바인딩은 왜 onDestroyView에서 비우는가?모바일뷰 바인딩 객체를 해제하지 않아 발생하는 메모리 누수라는 공통된 개념을 다룹니다.
- 메모리 부족 시 어떤 프로세스부터 종료되는가?모바일안드로이드 메모리 누수와 메모리 부족으로 인한 프로세스 종료는 모두 메모리 관리 체계와 관련이 있다.
- 화면이 닫혔는데 객체가 남는 이유는?모바일둘 다 모바일 환경에서 화면 종료 후에도 객체가 메모리에 남아 발생하는 메모리 누수 문제를 다룬다.
- 자동 참조 계산인데 왜 메모리가 남는가?모바일메모리 누수는 참조 계산이나 가비지 컬렉션의 한계로 인해 발생하며, 두 질문 모두 메모리 회수 실패 문제를 다룹니다.
- JVM GC의 효율을 높이는 튜닝 포인트는 무엇인가?프레임워크안드로이드의 가비지 컬렉터(GC) 기반 메모리 관리 방식은 JVM GC의 동작 원리와 직접적으로 연결된다.