iOS Memory Deep Dive - 2

ChangJun Lee·2024년 5월 7일
0
post-thumbnail
post-custom-banner

iOS Memory Deep Dive - 2

  • WWDC 18 의 iOS Memory Deep Dive 세션을 정리

Footprint 프로파일링

  • 메모리 프로파일링 도구들은 몇가지가 있는데, 아래는 Xcode 의 Memory gauge
  • 앱의 메모리 사용량을 쉽고 빠르게 확일 할 수 있음
  • 노란색 영역부터가 Memory Warning
    Xcode Memory gauge

  • Instruments 는 Xcode 에서 command + i 로 사용할 수 있음
  • 앱의 Footprint 를 조사하는 여러 방법을 제공
  • Allocations (할당), Leaks (메모리 누수) 와 VM Tracker 그리고 Virtual memory trace
    Instruments

  • VM Tracker 는 Dirty Memory 와 Compressed Memory 를 프로파일링 하는 방법 제공
  • 이미지 좌측 상단에, Dirty Size / Swapped Size 가 보이는데, 이때 Swapped 는 Compressed 를 말함
  • 해당 메모리에 있는 정보도 확인 가능
    VM Tracker

  • Virtual memory trace 는 이름 그대로 앱과 관련된 가상 메모리 성능에 대한 상세 내용을 볼 수 있음
  • Cache Hot, CoW, Zero fill 등 정보 확인 가능
    Virtual memory trace

    Zero fill
    Copy on Write 에서 자식 프로세스를 생성하면 부모 프로세스가 가지고 있던 Page table을 그대로 물려받음
    이 때, 주소만 공유 / 복사 X
    자식 프로세스에 Write 작업을 요청하면, page를 메모리에 복사해 새로 올림
    자식 프로세스의 page를 보고 부모 프로세스가 어디에 접근했는지와 같은 정보를 읽을 수 있기 때문에 새로 올리는 page를 0으로 초기화 해주는 것을 zero-fill-on-demend-page 라고함


  • Memory Deep Dive - 1 의 마지막에 말한 EXC_RESOURCE_EXCEPTION 에러가 나는 것으로 상태를 알 수 있음
    Xcode Debugger

  • 또한 Xcode 내부적으로 Memgraph 파일을 사용하여 메모리 사용 정보를 저장
  • 프로젝트 실행 후, 첫 이미지의 핑크색 원이 가리키는 아이콘을 눌러 Memgraph 를 확인 가능
    (지금 노란 느낌표가 떠있는 곳을 추후에 확인해보려고 함)
  • 두번째 이미지처럼, Xcode / File / Export Memgraph 를 눌러 저장 가능
  • 저장 된 Memory Graph 파일을 Command Line Tool 에서 사용하여 세부 내용 확인 가능
    MemgraphExport Memgraph

  • 아래와 같이 터미널에서 사요할 수 있음
  • 프로세스에 할당된 VM 영역 - 메모리 사용에 대한 상세한 자료를 볼 수 있음
    vmmap in command tool line

  • vmmap --summary {App Name}.memgraph 를 사용하면 요약된 정보를 얻을 수 있음
  • 이때, Swapped Size 는 압축된 크기가 아니라, 압축된 크기를 예상해서 제공
    vmmap --summary - command line tool

  • vmmap {App Name}.memgraph 를 사용하면 모든 정보를 얻을 수 있음
    vmmap - command line tool

  • 아래 이미지처럼 표준 command-line 유틸리티와 잘 작동
  • 아래 이미지 속 코드를 풀어보면,
    pages Flag : bytes 형식 대신 페이지 수를 보여줌
    grep : 아래 이미지에서는 다이나믹 라이브러리 파일을 검색
    awk - print : 파일에서 레코드 선택, 값 조작, 출력
    vmmap ans AWK

  • leaks {App Name}.memgraph 를 통해 런타임에 root 가 없는 오브젝트 추적 가능
    오브젝트가 leaks 상태? -> 절대 해제할 수 없는 Dirty Memory
  • 두번째 이미지 최하단을 보면 총 4개, 480바이트의 용량의 메모리 누수를 확인 할 수 있음
    leaks - command line tool - 1leaks - command line tool - 2

  • 또한 다음과 같은 명령어를 사용할 수 있음
    heap {App Name}.memgraph : 각 오브젝트의 클래스 이름, 오브젝트 수, 해당 오브젝트 클래스의 평균 크기 및 전체 크기에 대한 정보
    heap --sortBySizw {App Name}.memgraph : 힙은 기본적으로 개수별로 정렬되지만, 해당 명령어를 사용하면 크기대로 볼 수 있음
    heap {App Name}.memgraph -addresses all | <classes-pattern> : 해당 오브젝트의 주소를 알 수 있음
    heap - command line tool

  • 다시, leaks 로 돌아와서 설명하자면,
  • leaks --traceTree 0x600003910ea0 {App Name}.memgraph 로 object 를 조회할 수 있음
  • 현재 그래프가 조회되지 않는 것을 보면, 생성만 되고 참조되지 않는 상황
    leaks --traceTree - command line tool

  • malloc_history {App Name}.memgraph --fullStacks 0x600003910ea0 를 통해 객체 생성을 역추적 할 수 있음
  • 하지만 현재 The target process has no stack logs. Run it with the MallocStackLogging environment variable set to get stack logs. 라는 메세지가 확인 됨
  • 아래 이미지처럼, Edit Scheme 에서 Diagnostics 의 Malloc Stack Logging 을 켜줘야 추적이 가능
    Edit Scheme / Diagnostics / Malloc Stack Logging

  • Edit Scheme 에서 설정을 마치고, 다시 해보면 확인할 수 있음
  • 현재 이미지에서는 com.hrmi.Moment 가 내가 App 에서 호출한 코드
  • Xcode 의 Backtrace 에서도 확인 가능 ( 2번째 이미지 )
    현재 이미지에서 7번을 보면 우측에 화살표가 있는 것을 볼 수 있는데, 이 화살표를 누르면 해당 코드로 이동
    malloc_historyXcode 의 Backtrace

  • 위에서 다룬 3가지를 다시 정리해보자면,
    malloc_history : 메모리의 오브젝트 또는 주소를 참조하는 것이 어떤 것인지 확인하고 싶다거나, 주소에 대한 역추적을 원할 때 사용
    leaks : 메모리에서 오브젝트를 참조하는 항목을 확인하려는 경우 사용
    vmmap or heap : reigon이나 인스턴스의 크기를 확인하고 싶을 때 사용
    malloc_history / leaks / vmmap / heap
profile
iOS Developer
post-custom-banner

0개의 댓글