[android] "Memory leak" detect library |
https://medium.com/square-corner-blog/leakcanary-detect-all-memory-leaks-875ff8360745
-
Square 에서 고객 사인에 대한 OOM 방지를 위해 한 노력들
1. Bitmap.Config.ALPHA_8 로 Bitmap 생성 (color 값이 필요 없는 경우.)
2. OutOfMemoryError(이하 OOM) 을 catch 해서 GC 를 강제로 수행하고 retry
-
Bitmap 이 문제가 아님을 깨달음.
OOM 은 memory 가 full 에 가까우면 작은 bitmap 을 생성할 때도 죽을 수 있다.
즉, 애초에 memory leak 이 나지 않게 해서 memory footprint 를 줄이는 것이 좋다.
-
Memory leak 을 잡으려면..
1. crash log 를 통해서 OOM 에 대한 이해가 먼저 필요하다. ( crash log 를 쌓는 것은 Bugsnag, Crashlytics, Developer console 등이 있다. )
2. 재현을 시도해보자.
3. OOM 이 발생했을 때 heap dump 를 하자. ( UncaughtExceptionHandler 를 설치해서, OOM 일 경우 Debug.dumpHprofData 함수를 호출하자. )
4. MAT 이나 YourKit 을 통해 GC 되어야 하는데 안 되고 있는 것들을 추적하자
5. GC root 로부터 shortest strong reference path 를 계산하자.
6. 위의 과정을 통해 얻어진 결과를 보고 memory leak 을 잡자.
LeakCanary
이는 memory leak 을 잡는 open source project 이다.
간단한 세팅만 해주면, leak 이 있을 때 notification 으로 알려준다.
https://github.com/square/leakcanary
dependency 추가
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
}
Application 에서 LeakCanary 세팅
public class ExampleApplication extends Application { @Override public void onCreate() { super.onCreate(); if (LeakCanary.isInAnalyzerProcess(this)) { // This process is dedicated to LeakCanary for heap analysis. // You should not init your app in this process. return; } LeakCanary.install(this); // Normal app init code... } }
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Doze 모드와 GCM high priority 조합 중 주의해야 할 것 (0) | 2019.01.31 |
---|---|
[android] Lazy loading dex files (0) | 2019.01.30 |
[android] Google Play Service: Nearby Connections API (0) | 2019.01.28 |
[android] background work(AlarmManager) 수행에 대한 이야기 (0) | 2019.01.27 |
[android] Chrome Custom Tabs (3) | 2019.01.26 |
댓글