본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] "Memory leak" detect library

by 돼지왕 왕돼지 2019. 1. 29.
반응형

[android] "Memory leak" detect library


https://medium.com/square-corner-blog/leakcanary-detect-all-memory-leaks-875ff8360745


bitmap.config.alpha_8, dumphprofdata, gc root, heap dump, install, isInAnalyzerProcess, leak canary, mat, memory footprint, memory leak, OOM, oom catch gc, oom 에 대한 이해, out of memory, out of memory error, OutOfMemoryError, Square, uncaughtexceptionhandler, [android]


-

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...
  }
}



반응형

댓글