일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 타이쿤
- 유니티
- GIT
- 서브모듈 sourcetree
- gitlab submodule
- 쿼터뷰
- 카페오냥
- Unity
- java
- 티스토리
- Android
- 앱개발
- submodule sourcetree
- 안드로이드개발
- 목서버
- 개발
- 서브모듈 pull
- 앱
- Android Studio
- github submodule
- github
- 안드로이드
- 2d게임
- Kotlin
- 안드로이이드 submodule
- 게임개발
- 코틀린
- DataBinding
- firebase
- 내 맘대로 정리한 안드로이드
- Today
- Total
Uing? Uing!!
[안드로이드 팁] LeakCanary: 메모리 누수(memory leak)를 잡아주는 라이브러리 본문
LeakCanary
안드로이드에서 메모리 누수는 흔한 문제이다.
메모리 누수가 발생하는 경우는 다양하지만, 특히 context를 잘못 사용할 경우에 흔히 발생한다.
발생하기 쉬운 문제이지만, 프로젝트의 범위가 방대할 경우 프로파일링 기능을 사용하더라도 정확히 어디에서 메모리 누수가 발생하는지 바로 파악하기 어려울 때가 있다.
LeakCanary는 이런 메모리 누수 상황에서 정확히 어디에서 누수가 발생하는지를 분석하고 알려주는 라이브러리이다.
적용법
적용법은 아주 간단하다.
app단의 build.gradle에 leakcanary 의존성을 추가해주면 끝이다.
물론 디버깅 상태에서만 활용할 것이므로 debugImplementation으로 추가한다.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
활용법
의존성을 추가해 주었다면 자동으로 LeakCanary가 활성화된다.
이 상태에서 앱을 빌드하고 실행하면, 디버그 앱과 함께 Leaks라는 앱이 함께 설치된다.
지금까지는 누수가 발생하지 않았기 때문에 기본 화면에 아무것도 나타나지 않는다.
실제 메모리 누수가 어떻게 감지되는지를 확인하기 위해 context 누수가 발생하는 코드를 작성해 보았다.
(이 코드의 경우에는 너무 직접적으로 컨텍스트가 누수되는 경우이기 때문에 IDE에서부터 노랗게 린팅이 된다.)
// context가 누수되는 오브젝트
object ObjectWithContext {
var context: Context? = null
}
// 해당 액티비티를 종료할 경우 context 누수가 발생
class SubActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ObjectWithContext.context = this
}
}
이렇게 코드를 작성하고 SubActivity 화면에 접근한 후 액티비티를 종료하면, 컨텍스트 누수가 발생한다.
잠시 기다리면, 상단바에 세로줄 4개가 그어진 아이콘이 나타난다.
dump to heap를 하기 위해 해당 알림을 누르면, 잠시 로딩 이후 dump가 완료되었다는 알림이 발생한다.
이제 분석된 결과를 확인해 보자.
확인하고 싶은 릭을 클릭한 뒤 스크롤을 내려보면 메모리 릭이 어디에서 발생했는지 확인할 수 있다.
이 케이스에서는 ObjectWithContext라는 오브젝트에서 context 누수가 발생했고,
SubActivity 인스턴스에서 이 메모리 누수를 발생시켰음을 알려주고 있다.
* LeakCanary에 대한 더 자세한 내용은 공식 페이지에서 확인할 수 있다.
단점
LeakCanary는 메모리 누수를 파악하는데 있어 유용한 툴이지만, 디버깅 시에 이 라이브러리가 사용되고 있으면 성능 저하가 눈에 띄게 나타난다. (적어도 나는 그렇게 느꼈다.)
따라서, 메모리 누수가 있다고 생각될 때 그 위치를 파악하는 용도로 그때그때 의존성을 추가했다가 뺐다가 하는 방식으로 쓰는 것이 좋을 듯하다.
p.s. LeakCanary 알려주신 팀원분 감사합니다!
'Android' 카테고리의 다른 글
[안드로이드 팁] Annotate와 Git History: 안드로이드 스튜디오에서 깃 커밋 히스토리 확인하기 (0) | 2021.10.25 |
---|---|
[안드로이드 삽질기록] TextWatcher의 함정: 키보드마다 동작이 다르다? (1) | 2021.10.23 |
[안드로이드 팁] public.xml: 라이브러리 리소스 숨기기 (0) | 2021.10.20 |
[안드로이드 팁] Build Varients: 같은 프로젝트로 두 개 이상의 앱 빌드하기(BuildTypes & ProductFlavors) (1) | 2021.10.20 |
[안드로이드 삽질기록] 화면 상 가려져 있는 뷰가 클릭될 경우 해결법 (0) | 2021.08.03 |