티스토리 뷰

앱을 개발하는데 있어서, 효율적인 알고리즘 및 로직을 작성하는 것도 중요하지만 불필요한 리소스가 낭비되는 것을 방지되는 것 역시 매우 중요합니다!

Memory Leak, 즉 메모리 누수의 경우 불필요하게 메모리 영역을 잡아먹음과 동시에 메모리에서 해제되지 않은 인스턴스가 지속적으로 특정 로직을 실행하게 되면 리소스를 잡아먹기 때문에 앱의 성능에도 영향을 끼칠 수 있습니다.

아무튼 쉽게 생각하고 간과해서는 안 되는 문제라는 건데요. 이러한 메모리 누수를 확인하고 해결하는 방법 세 가지를 소개해 드리려고 합니다.

1. retain cycle이 발생하지 않도록 주의 깊게 코드를 작성하자! 

Swift의 경우 ARC에 의해 힙 영역에 할당된 인스턴스 중 reference count가 0인 인스턴스의 경우 메모리에서 해제되도록 관리되는데요.  그런 만큼 retain cycle이 발생하지 않도록 주의 깊게 코드를 작성해야 합니다. 추가로 class의 deinit에 로그나 프린트 구문을 넣음으로써 인스턴스가 메모리에서 잘 해제되고 있는지 확인도 가능합니다.  

ex) 

deinit {
    print("### deinit OOOViewModel!!") // <- 호출되지 않으면 메모리 누수
}

 

2. Instruments의 Leaks 사용하기

Xcode는 앱의 성능을 분석하고 디버깅하는데 도움을 주는 여러 도구들을 제공해주고 있는데요. 그중 하나가 Instruments의 Leaks입니다. (Leaks는 메모리의 참조 관계, 참조 카운트, 누수 탐지 등을 확인할 수 있습니다.)

Instruments의 경우 command + i 를 눌러 실행할 수 있고, Leaks만 확인할 거라면, Debug Navigator -> Memory에서 Profile in Instruments(아래 이미지 빨간색 상자)-> Restart를 누르면 됩니다. 

실행 후 화면 상단 좌측을 보면 Allocations와 Leaks가 보이고, Leaks를 클릭해보면 시간에 따라 메모리 leak이 발생하고 있는지 유무가 체크 박스로 나타나게 됩니다. 

만약 Memory leak이 발생하고 있으면 아래 박스가

새로운 누수가 발생하고 있지 않다면 아래처럼 

아예 누수가 없으면 초록색 체크박스가 뜨게 됩니다. 

만약, 빨간색 X박스에 커서를 가져가 보면 몇 개의 인스턴스가 누수되고 있는지 그 개수도 알려주게 되는데요.  그 아래를 보면 어떤 객체가 누수되고 있는지, 객체에 대한 참조 카운트가 몇인지, 누수가 얼마만큼 되고 있는지, 객체와 연관된 라이브러리 등을 파악할 수 있습니다. 

 

여기서 특정 객체(Leaked Object)를 클릭해 보면 아래와 같이 Stack Trace를 확인할 수 있고, 어느 코드가 메모리 누수와 연관됐는지 확인할 수 있습니다. (모든 객체가 Stack Trace 및 코드 확인이 가능한 건 아닙니다.) 

누수는 내가 작성한 코드에서 발생할 수도 있고, 경우에 따라서는 사용하고 있는 오픈소스 라이브러리에서 발생할 수도 있습니다.

많은 정보를 얻었으니 해당 정보를 토대로 메모리 누수 원인을 제거하면 끝!

 

3. Debug Memory Graph 사용하기

Memory 관련 디버깅에 있어 사용할 수 있는 또 다른 방법에는 Memory Graph가 있습니다.

디버깅 하기 위해서 먼저 scheme 편집으로 들어가, Diagnostics -> Malloc Stack Logging 설정을 Live Allocatons Only로 바꿔 줍니다.

빌드 후, 똑같이 Debug Navigator -> Memory 하단의 Debug Memory Graph를 들어가 보면 메모리에 할당된 객체 (및 개수), 메모리 참조 그래프 등을 확인할 수 있습니다. 

여기서 하단의 'show only leaked allocations' 버튼을 누르면 메모리 누수가 되고 있는 인스턴스만 필터링해서 볼 수 있습니다.

Memory Graph에서도 Leaks와 마찬가지로 객체에 따라 Stack Trace를 제공해주는 경우가 있음으로, 어느 코드가 메모리 누수의 시발점인지 파악하는데 도움을 줍니다. 

모두 메모리 누수 없는 좋은 앱을 만들기 바라며 해당 포스팅이 도움이 됐으면 좋겠습니다. 

읽어주셔서 감사합니다 :) 

댓글
링크
최근에 올라온 글
최근에 달린 댓글