메모리 누수
- 프로그램이 동적으로 할당한 메모리 영역 중 일부를 더 이상 사용하지 않음에도 불구하고 해제하지 않아, 사용할 수 있는 메모리가 점점 줄어드는 현상
- 애플리케이션의 성능 저하나 시스템의 안정성 문제를 초래할 수 있다.
- 자바와 같은 관리형 언어에서는 가비지 컬렉터가 더 이상 사용되지 않는 객체를 자동으로 회수하지만, *특정 상황에서는 메모리 누수가 발생할 수 있다.
- 특정 상황 : 개발자가 의도치 않게 객체에 대한 참조를 유지하게 되어 가비지 컬렉터가 해당 객체를 회수할 수 없는 상황
메모리 누수의 원인
- 장기간 생존하는 컬렉션 객체에 대한 참조
- 예시: HashMap 과 같은 컬렉션에 객체를 계속 추가하면서, 사용하지 않는 객체를 제거하지 않는 경우 메모리 누수가 발생할 수 있다.
- 리스너나 콜백 객체와 같이 외부 객체에 대한 참조
- 객체들이 적절히 해제되지 않으면, 가비지 컬렉터가 이를 회수할 수 없어 메모리 누수가 발생한다. 왜냐하면 이러한 객체들은 생명 주기가 길거나 애플리케이션 전체에 걸쳐 존재하기 때문에, 가비지 컬렉터가 회수하기 어렵기 때문이다.
- 정적 변수에 대한 참조
- 애플리케이션의 생명 주기와 동일하므로, 이를 통해 참조되는 객체들은 프로그램이 종료될 때까지 메모리에서 해제되지 않는다.
메모리 누수 대처 방법
- 먼저 해당 객체에 대한 참조를 유지하는 원인을 파악해야 한다. 이후, 불필요한 참조를 제거하거나, 적절한 시점에 객체를 해제하는 방법을 적용해야 한다.
- 예시: 컬렉션 객체에서는 사용하지 않는 객체를 주기적으로 제거하거나, *WeakReference 를 사용하여 가비지 컬렉터가 객체를 쉽게 회수할 수 있도록 할 수 있다.
- WeakReference : 객체가 더 이상 사용되지 않을 때 GC 가 해당 객체를 수거할 수 있도록 한다.
- 예시: 컬렉션 객체에서는 사용하지 않는 객체를 주기적으로 제거하거나, *WeakReference 를 사용하여 가비지 컬렉터가 객체를 쉽게 회수할 수 있도록 할 수 있다.
- 리스너나 콜백 객체의 경우, 객체가 더 이상 필요하지 않을 때 명시적으로 해제하는 것이 중요하다. 이를 통해 가비지 컬렉터가 이러한 객체를 회수할 수 있게 된다.
- 정적 변수의 사용을 최소화하고, 필요한 경우에만 사용하는 것도 메모리 누수를 방지하는 데 도움이 된다.
일반적인 메모리 누수 패턴
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 |