[Android] Memory Leak with Profiler, LeakCanary

πŸ’‘μ•ˆλ“œλ‘œμ΄λ“œ 개발 ν™˜κ²½μ—μ„œ 자주 마주칠 수 μžˆλŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ— λŒ€ν•΄μ„œ ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€ !

 

Memory Leak

  • Memory Leak은 ν”„λ‘œκ·Έλž¨μ΄ 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜μ§€ μ•Šκ³ , 계속 μ°¨μ§€ν•˜κ³  μžˆλŠ” μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ μžμ›μ΄ λ‚­λΉ„λ˜μ–΄ μ•±μ˜ μ„±λŠ₯이 μ €ν•˜λ˜κ±°λ‚˜, μ‹¬ν•œ 경우 앱이 κ°•μ œ μ’…λ£Œλ˜λŠ” 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œλŠ” 주둜 μ•„λž˜ ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ Memory Leak

  • μƒνƒœ μœ μ§€
    • 객체가 Activity, Fragment와 같은 라이프사이클을 κ°–λŠ” μ»΄ν¬λ„ŒνŠΈμ— κ°•ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€.
  • λ¦¬μ†ŒμŠ€ λˆ„μˆ˜
    • μ‚¬μš© ν›„ 적절히 ν•΄μ œλ˜μ§€ μ•ŠλŠ” λ¦¬μ†ŒμŠ€λ‘œ 파일 ν•Έλ“€, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 등이 μžˆμŠ΅λ‹ˆλ‹€.
  • 콜백 및 λ¦¬μŠ€λ„ˆ
    • μ½œλ°±μ΄λ‚˜ λ¦¬μŠ€λ„ˆκ°€ λ“±λ‘λœ ν›„ ν•΄μ œλ˜μ§€ μ•Šκ±°λ‚˜ 적절히 κ΄€λ¦¬λ˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•©λ‹ˆλ‹€.

Android Studio Profiler

  • μ•ˆλ“œλ‘œμ΄λ“œ μŠ€νŠœλ””μ˜€μ—μ„œλŠ” Profilerλ₯Ό 톡해 λ¦¬μ†ŒμŠ€μ˜ μ‚¬μš©λŸ‰κ³Ό λˆ„μˆ˜λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • Memory 탭에선 Leaksκ°€ λ°œμƒν–ˆμŒμ„ ν‘œμ‹œν•΄μ£ΌλŠ” κΈ°λŠ₯으둜 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ‹œμŠ€ν…œ λ©”λͺ¨λ¦¬μ— 앱이 μ–΄λ–€ 영ν–₯을 μ£Όκ³  μžˆλŠ” 지에 λŒ€ν•΄ 더 μ•Œμ•„λ³Ό 수 μžˆλ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ, 좔적이 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ•± μ„±λŠ₯ ν”„λ‘œνŒŒμΌλ§  |  Android Studio  |  Android Developers

 

μ•± μ„±λŠ₯ ν”„λ‘œνŒŒμΌλ§  |  Android Studio  |  Android Developers

Android μŠ€νŠœλ””μ˜€μ—μ„œ 앱을 ν”„λ‘œνŒŒμΌλ§ν•˜λŠ” 방법을 μ•Œμ•„λ΄…λ‹ˆλ‹€.

developer.android.com

탐지 방식

  • Android Studio IDE ν•˜λ‹¨μ—μ„œ Profiler 탭을 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Memory μ˜μ—­μ—μ„œ λ©”λͺ¨λ¦¬μ— λŒ€ν•΄ μžμ„Έν•œ λ‚΄μš©μ„ 확인할 수 있고, Force Garbage Collection을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • [Force Garbage Collection] : GC λ‘œλ„ ν•΄μ œλ˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬λ₯Ό κ²€μΆœν•©λ‹ˆλ‹€.
  • Capture heap dumpλ₯Ό 톡해 Memory Leakκ°€ λ°œμƒν•˜λŠ” 수λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” 첫 번째 ν•­λͺ©λΆ€ν„° λΆ„μ„ν•˜λ©°, tree ꡬ쑰둜 κ΅¬ν˜„λœ 계측 κ΅¬μ‘°μ—μ„œ childλ₯Ό νƒμƒ‰ν•˜μ—¬ λˆ„μˆ˜λ₯Ό λ°œμƒν•˜λŠ” λ³€μˆ˜λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • referenceλ₯Ό μ°Ύμ•„κ°€λŠ” κ³Όμ •μœΌλ‘œ μ–΄λ–€ μ›μΈμœΌλ‘œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν–ˆλŠ”μ§€λ₯Ό μœ μΆ”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Garbage Collection

  • ν”„λ‘œκ·Έλž¨ 개발 μ‹œ λ°œμƒν•œ μœ νš¨ν•˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬λ₯Ό μ •λ¦¬ν•΄μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • JVM의 가비지 컬렉터가 λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μ •λ¦¬ν•˜λ©°, GC라고도 ν•©λ‹ˆλ‹€.

LeakCanary

  • LeakCanary은 μ•ˆλ“œλ‘œμ΄λ“œ μ•±μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μžλ™μœΌλ‘œ νƒμ§€ν•˜κ³  λΆ„μ„ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.
  • Squareμ—μ„œ κ°œλ°œν•œ μ˜€ν”ˆ μ†ŒμŠ€ 라이브러리둜, μ•±μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³  λˆ„μˆ˜κ°€ λ°œμƒν•˜λ©΄ 이λ₯Ό κ°μ§€ν•˜μ—¬ κ°œλ°œμžμ—κ²Œ κ²½κ³ ν•©λ‹ˆλ‹€.

μ£Όμš” κΈ°λŠ₯

  • μžλ™ 감지
    • 앱이 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°œμƒμ‹œν‚¬ λ•Œ 이λ₯Ό μžλ™μœΌλ‘œ κ°μ§€ν•©λ‹ˆλ‹€.
  • Report
    • λˆ„μˆ˜λ₯Ό λ°œκ²¬ν•˜λ©΄ μƒμ„Έν•œ 리포트λ₯Ό μƒμ„±ν•˜λ©°, 이 λ¦¬ν¬νŠΈμ—λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•œ μœ„μΉ˜μ™€ 원인에 λŒ€ν•œ 정보가 ν¬ν•¨λ©λ‹ˆλ‹€.
  • 디버깅 지원
    • λ¦¬ν¬νŠΈμ—λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ heap dumpλ₯Ό ν¬ν•¨ν•œ 뢄석 정보가 μžˆμ–΄ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

μ˜μ‘΄μ„± μΆ”κ°€

  • LeakCanary을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μ•±μ˜ 디버그 λΉŒλ“œμ—μ„œλ§Œ μž‘λ™ν•˜λ©°, 앱을 λΉŒλ“œν•˜λ©΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό κ°μ§€ν•©λ‹ˆλ‹€.
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
}
  • 이λ₯Ό ν™œμš©ν•΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 쑰기에 λ°œκ²¬ν•˜κ³  μˆ˜μ •ν•¨μœΌλ‘œμ¨ μ•±μ˜ μ•ˆμ •μ„±κ³Ό μ„±λŠ₯을 크게 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ™μž‘ 방식

  • retained 객체 κ°μ§€ν•˜κΈ°
    • Activity, Fragment, View, ViewModel 등이 파괴되고 5초 이내에 GCκ°€ λ˜μ§€ μ•ŠμœΌλ©΄ retained 된 κ²ƒμœΌλ‘œ νŒλ‹¨ν•΄ 이λ₯Ό Logcat에 κΈ°λ‘ν•©λ‹ˆλ‹€.
    • 이 ν›„ LeakCanaryλŠ” νž™μ„ λ€ν”„ν•˜κΈ° 전에 retained κ°μ²΄λ“€μ˜ 수λ₯Ό μ„Έκ³  μ•Œλ¦ΌμœΌλ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
  • νž™ λ©”λͺ¨λ¦¬ λ€ν”„ν•˜κΈ°
    • retained κ°μ²΄μˆ˜κ°€ μž„κ³„κ°’μ„ λ„˜μ–΄κ°€λ©΄ LeakCanaryλŠ” Java νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ•ˆλ“œλ‘œμ΄λ“œ 파일 μ‹œμŠ€ν…œμ— .hprof 파일둜 λ€ν”„ν•©λ‹ˆλ‹€.
    • νž™μ„ λ€ν”„ν•˜λ©΄ 짧은 μ‹œκ°„ λ™μ•ˆ 앱이 μ •μ§€λ˜κ³ , LeakCanary에 ν† μŠ€νŠΈκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.
  • νž™ λ©”λͺ¨λ¦¬ λΆ„μ„ν•˜κΈ°
    • SharkλΌλŠ” 뢄석 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ μ €μž₯ 된 .hprof νŒŒμΌμ„ λΆ„μ„ν•˜κ³ , λ€ν”„λœ νž™μ—μ„œ retained 객체λ₯Ό μ°Ύμ•„λƒ…λ‹ˆλ‹€.
    • 뢄석이 μ™„λ£Œλ˜λ©΄ 둜그캣 및 μ•Œλ¦Όμ„ 톡해 뢄석 κ²°κ³Όλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λΆ„λ₯˜ν•˜κΈ°
    • LeakCanaryλŠ” μ•±μ—μ„œ 찾은 λ©”λͺ¨λ¦¬λ¦­μ„ μ•„λž˜μ™€ 같이 λΆ„λ₯˜ν•©λ‹ˆλ‹€.
      • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λˆ„μˆ˜
      • 라이브러리 λˆ„μˆ˜
    • 이λ₯Ό 톡해 타사 μ½”λ“œ λ²„κ·Έλ‘œ λ°œμƒν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μΈμ§€, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€ λˆ„μˆ˜μΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ 

https://leveloper.tistory.com/197