오늘은 안드로이드 스튜디오를 이용해서

MemoryLeak을 관리하는 방법을 정리해 보도록 하겠습니다.

 

 

1. MemoryLeak

MemoryLeak 은 객체입니다.

회수될 때, 회수되지 못하고,

현재 프로세스에서 자리를 차지하고는 있는데,

액세스 하지는 못하는 그러한 객체이지요.

차지하는 메모리가 커지면 시스템에 영향을 미치므로 강제적으로 안드로이드 시스템이

앱의 프로세스 자체를 중단시켜버리게 할 수도 있습니다.

 

2. GC(Garbage Collection)

2-1. GC Root

heap메모리 밖에서 액세스할 수 있는 객체

로컬 변수, Thread 등이 있습니다.

 

2-2. GC

Garbage Collection이 JVM에 의해서 실행되면,

GC Root를 먼저 찾습니다.

그리고나서 이 GC Root로부터 액세스할 수 있는 (레퍼런싱 된) 객체들을 찾구요.

그럼 이렇게 액세스 할 수 있는(레퍼런싱 된)객체들은 남겨둡니다.

반대로 GC Root에서 액세스 할 수 없는 객체들은 다 메모리를 회수해가 버리는 것이지요.

 

2-3. Activity 그리고 Fragment

위에서 GC Root에 있는 객체와 그로부터 액세스할 수 있는 객체들은 GC를 하지 않는다고 하였는데요.

Activiy와 Fragment는 많은 메모리를 차지하고 있기 때문에,

메모리 관리를 할 때 주의를 기울여야 합니다.

 

3. Profiler를 통한 메모리 관리

Profiler는 Activity, Fragment, Leak들을 찾을 수 있습니다.

 

3-1. Heap Dump

우리가 메모리 관리를 위해서 Profiler에서 하는 가장 중요한 일 중 하나는,

Heap을 dump하는 일 입니다.

아래 이미지의 쓰레기통 아이콘의 우측 옆에 있는 아이콘을 클릭해주면 됩니다.

 

보는 방법은 여러가지 이지만, 처음 다뤄보시는 분은

정렬을 아래와 같이 Arrange by package로 하시면,

기존 패키지의 클래스들 위주로 보기 더욱 편하실 것 같습니다.

 

참고로 heap dump를 하면 live모니터링이 중단되는 되요.

Profiler의 우측 상단에 다시 live되도록 하는 버튼이 있으니

필요할 경우 이 버튼을 사용해 주면 됩니다.

 

 

3-2. MemoryLeak을 찾는 방법

A. destroy가 호출 되었는데 referenced된 Activity

B. 유효한 FragmentManager가 없는데 Referenced된 Fragment

C.Fragment사용시 주의할 점

- 생성은 되었지만 아직 사용이 않되어 있을 때

- Cached되었지만 FragmentTransaction에 속하지는 않을 때

 

4. NativeSize, ShallowSize, RetainedSize

이것을 보면 어디서 메모리가 소비되는지 알 수 있습니다.

Native Heap

ShallowSize는 객체 자체에 의해 소비되는 메모리 이구요.

Reatained Size

 

5. Depth

Depth는 GC루트로부터 레퍼런스된 뎁스를 의미합니다.

이 단계가 낮을수록 다양한 path를 가질 가능성이 있는 객체입니다.

그렇다면 GC될 가능성도 낮아질 수 있는 것 이지요.

 

 

만약 Depth가1이라면,

GCroot로부터 직접적으로 reference된 객체라는 의미입니다.

 

위에서 Activity는 LocationListener를 implement하고 있습니다.

만약 이 listener를 unregister해주지 않는다면,

Heap에 계속 존재하게 되고, 이것은 메모리릭으로 연결되게 됩니다.

 

6. Test

6-1. 액티비티 전환으로 테스트

메모리에 대해서 프로파일링 할 때 어떻게 해야할까요?

핵심은 GC가 제대로 되었는지를 보는 것이 될 것 입니다.

예를 들면, A액티비티에서 B액티비티로 이동후,

B액티비티가 destroy되고 A액티비티로 다시 돌아왔을 때,

release되지 못한 객체들이 있는지 보아야 하겠지요.

 

6-2. 강제로 GC를 실행한 후 모니터링

이번에는 profiler상단의 휴지통 아이콘을 클릭해서 강제로 GC를 하게 해 보겠습니다.

단축키는 Command + G입니다.

 

이렇게 한후 다시 휴지통옆의 heap dump버튼을 눌러서,

memoryleak이 발생하지 않았는지 보는 것 인데요.

 

 

 

8. MemoryProfiler를 처음부터 시작

아래이미지의 우측 끝의 아이콘을 클릭해주면 되는데요.

 

 

 

 

 

+ Recent posts