Leak Canary로 메모리 유출 탐지

4150 단어 너와 함께Android

LeakCanary


스퀘어는 메모리 유출을 감지하는 프로그램 라이브러리square/leakcanary를 공개해 바로 사용해 보았는데 매우 편리했다.

A small leak will sink a great ship


Piwai가 쓴 Leak Canary 기사가 여기 있습니다.
LeakCanary: Detect all memory leaks!
요컨대
  • 스퀘어는 비트맵 캐시에 고객의 서명을 적었지만 단말기 화면 크기를 확보하는 메모리로 인해 서명할 때 붕괴될 수 있어 OOM의 절반을 차지했다.
  • Bitmap.Config을 변경하고 OOM을 캡처하고 GC를 실행했지만 문제가 해결되지 않았습니다.
  • 우리는 우리가 잘못된 방법을 채택한 것을 발견했다.비트맵의 크기가 아니라 메모리 유출의 근본 원인이다.
  • 통상적으로 메모리 유출을 검출하는 것은 수동 작업이지만 라이브러리에서 자동으로 검출되면 메모리 유출을 수정하는 데 집중할 수 있다.그래서 Leak Canary라는 메모리 유출을 감지하는 프로그램 라이브러리를 만들었다.
  • 결과는 매우 좋았고 실제로는 OOM의 붕괴를 94% 감소시켰다.

  • If you want to eliminate OOM crashes, install LeakCanary now!

    LeakCanary 가져오기 방법


    Dependency에 leakcanary 추가
    dependencies {
     debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
     releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
    }
    
    LeakCanary는 애플리케이션을 초기화할 때만 초기화됩니다.
    public class ExampleApplication extends Application {
    
      @Override public void onCreate() {
        super.onCreate();
        LeakCanary.install(this);
      }
    }
    
    창고 안에 견본 항목이 있으니 한번 시험해 볼 수 있다.
    $ git clone [email protected]:square/leakcanary.git
    $ cd leakcanary/library
    $ ./gradlew leakcanary-sample:installDebug
    
    메모리 유출이 발생하면 알림이 뜨고 클릭하면 액티비티가 열리고 누가 어떤 대상을 가졌는지 볼 수 있다.

    그리고 메모리 유출 통지는 앱으로 설치돼 수시로 확인할 수 있다.이것은 샘플이 아니라 프로그램 라이브러리의 기능입니다. 항목에 한 줄만 추가하면 이 편리한 기능을 사용할 수 있습니다.

    LeakCanary의 메모리 유출 탐지 방법


    왜 한 줄만 쓰면 메모리 유출이 나오지?

  • LeakCanary.install(application).
  • ActivityRefWatcher 클래스를 통해ActivityLifecycleCalleback에 로그인합니다.
  • Activity가onDestroy에 의해 실행될 때마다 GC를 실행합니다.
  • 참조가 풀렸는지 확인하고 없으면 쌓아올려 분석하여 DisplayLeakActivity에 표시한다.
  • 정보 쌓는 거 어디서 났어요?

    Debug.dumpHprofData(fileName).
    hproof는 바이너리입니다. org.eclipse.mat 해상도를 사용하여 Snapshot으로 변환하고, 디스플레이를 편리하게 하기 위해 LeakTrace로 변환합니다.

    실제로 써봤어요.


    당장 앱에 넣으면 메모리 유출!Leak Canary를 보니 폐기돼야 할 Activity가 참고를 갖고 있었고, 조사한 어느 Fragment에서 Bus의 unregister가 유출됐다.

    한 줄만 들어가면 메모리 유출을 간단하게 알아낼 수 있어 좋다.우수한 스퀘어 엔지니어라도 메모리 유출을 놓치지 않기 때문에 사용하기 전에 Leak Canary에 가입하세요.

    좋은 웹페이지 즐겨찾기