ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 앱에서 너무 많은 메모리를 사용하면 어떻게 될까? 어떻게 확인할까?
    iOS 2021. 1. 15. 12:34
    728x90

    개인적으로 공부하며 정리하는 블로그 입니다.
    오류나 부족한 부분이 있을 수 있으니 감안하여 봐주시고 아낌없는 조언 감사드립니다 :D

     

    앱이 메모리를 너무 많이 사용하면 어떻게 될까요? 갑자기 궁금해져서 찾아보다가 Reducing Your App's Memory Use 문서를 읽은 내용을 정리해보려고 합니다 :)

    아이폰 디바이스에서 메모리는 매우 제한적입니다. 궁금해서 디바이스 별로 RAM 크기를 찾아봤는데 찾아봤는데 이정도 되는 것 같아요. (오피셜은 아닙니다...)

    https://itigic.com/how-much-ram-does-an-iphone-have-specifications/

     

    메모리는 한정된 자원이고, 가뜩이나 넉넉하지 않은데 여러 앱, 프로세스, 커널 등이 함께 써야하는 자원이기 때문에 잘 관리해줘야 합니다.

    따라서 하나의 앱이 너무 욕심부리면 아이폰은 적당히 하라고 먼저 경고를 보내줍니다. 
    EXC_RESOURCE exception type and MEMORY subtype 등이 있는 리포트인데 앱이 메모리 사용량의 한계까지 왔다는 의미입니다. 아직 앱이 종료되거나 하지는 않지만 곧 종료될 수 있는 위험 신호인거죠!

    계속 사용해서 결국 메모리 제한을 넘어버리면 아이폰은 앱을 종료시켜버립니다. 앱을 사용하고 있었다면 사용자는 잘 쓰다가 갑자기 앱이 꺼지는 경험을 하게 됩니다. 어 뭐지? 하고 앱을 다시 켜면 아예 종료된거기 때문에 앱이 처음부터 다시 실행됩니다.

    정확한 건 원문을 확인해주시고 대강 이렇게 쓰여있습니다 : )

     


     

    Overview

    디바이스에서 메모리(RAM)는 프로세스, 커널 등에서 공유되는 매우 제한적인 자원입니다. iOS는 메모리에 대한 다양한 요구 사항을 만족시키기 위한 기술들을 가지고 있지만 이 기술들은 속도와 응답성을 사용합니다. 예를 들어, iOS는 백 그라운드에서 동작하는 앱이 메모리를 많이 사용한다면 solid-state storage로 보낼 수 있습니다. 그렇게 되면 앱이 백그라운드 작업을 다시 실행시키거나 포 그라운드로 돌아오려고 할 때 딜레이가 발생합니다.

    만약 앱이 메모리를 너무 많이 사용한다면 iOS는 경고를 보냅니다. crash report 형태의 notifications를 받을 수 있습니다. 이 리포트는 EXC_RESOURCE exception type 과 MEMORY subtype 등을 포함하는데 앱 메모리가 거의 한계에 이르렀다는 걸 알려줍니다. 이는 메모리 사용 문제를 발견했다는 의미지 앱이 종료(terminated) 되었다는 걸 의미하지는 않습니다. 메모리 제한은 디바이스에 따라 다르며 앱이 이 제한을 초과하면 iOS가 앱을 종료시킵니다. 만약 포 그라운드에서 앱이 종료된다면 사용자는 앱이 갑자기 꺼지는 걸 보게됩니다. 그리고 사용자가 다시 앱을 실행시키려고 하면 앱은 백 그라운드에서 실행되는 게 아니라 처음부터 실행됩니다.

     


     

    그렇다면 앱이 메모리를 얼마나 쓰고 있는지는 어떻게 확인할까요?

    Xcode Organizer라는 녀석을 이용할 수 있습니다. MetricKit 이라는 걸 사용하는 모양이에요. (The Xcode Organizer and MetricKit each provide two metrics about memory use in an app.) Xcode Organizer는 아래 그림처럼 

    Window - Organizer로 켜시거나 옵션 + 쉬프트 + 커멘드 + O 눌러서 바로 켜실 수도 있습니다 :)

     

    그럼 Organizer에서 메모리 사용량을 볼 수 있습니다.

    이렇게 보시는 것처럼 메모리 사용량은 2가지 영역으로 관리됩니다.
    첫 번째는 Peak memory, 최고 메모리 사용량인데요, iOS가 주기적으로 샘플링 해서 수집하는데 그 중에 가장 큰 메모리를 보여줍니다. 
    두 번째는 Memory at Suspension, 앱이 일시정지 했을 때의 메모리를 보여줘요. 백그라운드로 갔을 때 기록합니다.

     

    메모리 사용량은 사용 중인 memory page가 얼마나 사용됐는지를 의미합니다. page는 보통 16KB로 되어있어요. 즉, page 수 x page 크기(16KB) 메모리 사용량이 되는거죠. 따라서 메모리 사용량은 KB까지 정확한 크기가 아니라 page size(16KB) 단위로 커집니다. 만약 33KB를 썼다면 메모리 사용량은 48KB가 되는거죠. 

    그럼 정확히 어떤 아이들이 메모리를 쓰고 있는 걸까요? 

    앱의 실행가능하거나 연결된 라이브러리들과 프레임워크들은 바로 메모리를 쓰고 있다고 판단되구요, 단순히 할당 된 애들은 아직 clean한 상태라 메모리를 사용하고 있다고는 보지 않습니다. 어떤 값을 할당해서 dirty한 상태가 되면 그때 메모리를 사용했다고 판단합니다.

     

    문서엔 대강 이렇게 쓰여져 있습니다.

     


     

    Understand Memory-Use Metrics

    Xcode Organizer 와 MetricKit 은 각각 메모리 사용에 대한 2개의 metrics를 제공합니다. 첫 번째 metric는 최대 메모리 사용량입니다. 이는 수집된 샘플 중에서 가장 높은 메모리 사용량입니다. iOS는 앱의 메모리 사용량을 주기적으로 샘플링해서 이 metric을 수집합니다. 두 번째 metric은 일시중시(on suspension) 상황에서 관찰된 메모리 사용량으로 앱이 백 그라운드로 들어갈 때 측정됩니다.

    iOS는 사용 중인 메모리 페이지 수에 페이지 크기(일반적으로 16KB)를 곱한 메모리 사용량을 측정합니다. 할당된 메모리에 단일 byte를 쓰는데 이 byte를 저장하기 위해 새 페이지를 할당해야 한다면 메모리 사용량이 16KB 증가할 수 있습니다. (그러니까 커질 때는 16KB단위로 커진다는 의미 같네요.)

    앱의 실행 파일 또는 연결된 라이브러리 및 프레임워크에 정의된 Data Structures는 memory-use metric에 기여합니다. 런타임에 앱에서 할당하는 메모리는 처음에는 이 metric에 영향을 주지 않습니다. "clean" 한 메모리들은 저장하기 위해 물리적 RAM을 바칠(dedicate) 필요가 없습니다. "dirty" 하게 되면 아래 그림처럼 이 content를 저장하기 위해 RAM을 바쳐야 합니다. Dirty memory는 memory-use metric에 기여합니다.

     

    View Data on Memory Use

    Xcode Organizer window의 Memory pane이나 MetricKit을 사용해서 앱의 메모리 사용량을 확인합니다.

    이 메모리 팬은 위 그래프에서 peak memory에 대한 정보를 보여주고 밑에 suspension 시의 메모리를 보여줍니다. 오른쪽 상단 모서리의 두 메뉴를 사용해서 디바이스 타입 별, 사용된 메모리 별로 정보를 필터링할 수 있습니다. 그래프를 클릭해서 먼저 클릭했던 그래프와 비교해볼 수 있습니다.

     

     

    참고

    Reducing Your App's Memory Use

    댓글

Designed by Tistory.