본문 바로가기
안드로이드/Android

[Android] 메모리 누수

by jinwo_o 2024. 9. 3.

메모리 누수

  • 프로그램이 동적으로 할당한 메모리 영역 중 일부를 더 이상 사용하지 않음에도 불구하고 해제하지 않아, 사용할 수 있는 메모리가 점점 줄어드는 현상
  • 애플리케이션의 성능 저하나 시스템의 안정성 문제를 초래할 수 있다.
  • 자바와 같은 관리형 언어에서는 가비지 컬렉터가 더 이상 사용되지 않는 객체를 자동으로 회수하지만, *특정 상황에서는 메모리 누수가 발생할 수 있다.
    • 특정 상황 : 개발자가 의도치 않게 객체에 대한 참조를 유지하게 되어 가비지 컬렉터가 해당 객체를 회수할 수 없는 상황

 

메모리 누수의 원인

  • 장기간 생존하는 컬렉션 객체에 대한 참조
    • 예시: HashMap 과 같은 컬렉션에 객체를 계속 추가하면서, 사용하지 않는 객체를 제거하지 않는 경우 메모리 누수가 발생할 수 있다.
  • 리스너나 콜백 객체와 같이 외부 객체에 대한 참조
    • 객체들이 적절히 해제되지 않으면, 가비지 컬렉터가 이를 회수할 수 없어 메모리 누수가 발생한다. 왜냐하면 이러한 객체들은 생명 주기가 길거나 애플리케이션 전체에 걸쳐 존재하기 때문에, 가비지 컬렉터가 회수하기 어렵기 때문이다.
  • 정적 변수에 대한 참조
    • 애플리케이션의 생명 주기와 동일하므로, 이를 통해 참조되는 객체들은 프로그램이 종료될 때까지 메모리에서 해제되지 않는다.

 

메모리 누수 대처 방법

  • 먼저 해당 객체에 대한 참조를 유지하는 원인을 파악해야 한다. 이후, 불필요한 참조를 제거하거나, 적절한 시점에 객체를 해제하는 방법을 적용해야 한다.
    • 예시: 컬렉션 객체에서는 사용하지 않는 객체를 주기적으로 제거하거나, *WeakReference 를 사용하여 가비지 컬렉터가 객체를 쉽게 회수할 수 있도록 할 수 있다.
      • WeakReference : 객체가 더 이상 사용되지 않을 때 GC 가 해당 객체를 수거할 수 있도록 한다.
  • 리스너나 콜백 객체의 경우, 객체가 더 이상 필요하지 않을 때 명시적으로 해제하는 것이 중요하다. 이를 통해 가비지 컬렉터가 이러한 객체를 회수할 수 있게 된다.
  • 정적 변수의 사용을 최소화하고, 필요한 경우에만 사용하는 것도 메모리 누수를 방지하는 데 도움이 된다.

 

일반적인 메모리 누수 패턴

1. 정적 참조에 대한 Activity 누수

  • 정적 참조는 앱이 메모리에 있는 한 지속된다.
  • 정적 참조에서 Activity 를 참조하는 경우 Activity 는 생명주기에 의해 Destory 된 후에 GC 되지 않는다.
  • 복잡한 뷰 계층 구조나 고해상도의 이미지의 경우 많은 양의 메모리가 누수될 수 있다.
  • 예시: 정적 뷰 or 변수 or 싱글톤 객체에 의한 Activity 참조, Activity Inner 클래스의 정적 인스턴스에 의한 Activity 참조

 

2. 작업자 스레드에 대한  Activity 누수

  • 작업 스레드는 Activity 보다 오래 지속될 수도 있다.
  • Activity 보다 더 오래 작업하는 작업자 스레드에서 Activity 를 참조하면 누수가 발생한다.
  • 예시: 스레드 or Handler 에서 Activity 참조

 

3. 스레드 자체 누수

  • Activity 에서 스레드를 시작할 때마다 스레드를 직접 관리해야 한다. 스레드는 Activity 보다 오래 작업할 수 있기 때문에 Activity 가 소멸되면 스레드를 중지시켜야 한다.

 

4. ViewModel 에서 액티비티 또는 뷰 누출

  • ViewModel 은 뷰 또는 LifecycleOwners 의 특정 인스턴스화(Activity, Fragment 등)보다 오래 지속되도록 설계되어 있다. 따라서 ViewModel 에서 해당 객체에 대한 참조를 가지면 메모리 누수가 발생할 수 있다.

 

메모리 누수 탐지하는 방법

 

[Android] LeakCanary로 메모리릭 잡기

LeakCanary란? LeakCanary란 Square사에서 만든 오픈소스 라이브러리로써, 메모리릭을 감지하여 OOM(Out of Memory) 에러를 줄일 수 있도록 도와준다. 메모리릭(Memory leak)이란? 메모리릭이란 애플리케이션에

leveloper.tistory.com


 

자바에서의 메모리 누수 이해 및 대처 방법

자바 애플리케이션에서 메모리 누수의 원인과 진단 방법, 그리고 효과적인 대처 방법에 대해 설명합니다.

f-lab.kr

 

[안드로이드] 메모리 누수

안드로이드 - 안드로이드에서 대표적인 메모리 누수의 예시와 누수를 탐지하는 라이브러리(Leak Canary)

velog.io

'안드로이드 > Android' 카테고리의 다른 글

[Android] px(pixel), dp(dip), sp  (0) 2024.10.01
[Android] Activity  (0) 2024.08.09
[Android] App Manifest  (0) 2024.08.08