메모리릭 이란?
메모리릭이란 필요없는 객체 또는 사라진 객체를 참고하고 있을 때 OOM(Out Of Memory)로 인해 충돌이 발생하는 것을 말한다.
안드로이드에서 발생하는, 내가 겪어본 메모리릭으로는 다음과 같다.
- application context를 UI와 관련된 곳에서 사용했을 때
- activity context를 잘못 참조하거나, 해당 activity가 사라졌음에도 어딘가에서 context를 변수화하여 참조하고 있을 때
- 이벤트 콜백, 비동기 작업이 제대로 종료되지 않았을 때
- fragment binding의 null 처리가 되지 않았을 때
Leak Canary 이란?
안드로이드 메모리릭을 감지하고 알려주는 라이브러리이다.
사용
1. 준비
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
}
2. 다운로드
기기에 빌드를 하면 다음과 같이 다운로드된 것을 확인할 수 있다.
3. 확인
클릭해서 들어가면 다음과같이 메모리릭 여부를 알 수 있다. 앱 진행 시 메모리릭이 발생하면 친절히 알림도 보내주고 해당 화면에서 상세한 내용을 확인이 가능하다.
4. 메모리릭 해결 경험
- UI와 관련된, 특정 activity에 연결 되어있을 때 사용하는 context는 application context가 아닌 해당 activity context를 사용할 것!!
- 싱글톤 클래스와 같은 앱 전역에 걸쳐서 사용하는 경우에는 application context를 사용할 것!!
- 이벤트 콜백, 비동기 작업 같은 경우에는 해당 라이프사이클이 해제(onDestroy)될 때까지 작업이 끝나지 않았다면 작업을 종료시키고 라이프사이클이 해제 되어야한다.
- fragment binding 같은 경우에는 onViewDestroy()에서 꼭 binding null 처리를 해줘야한다!!
이에 fragment는 생성과 해제에 있어서 베이스 코드가 많기 때문에 BaseFragement 부모 클래스를 만들어 사용하는 것이 좋다!!