관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 기본 (stack, heap) 본문

iOS 응용 (swift)

[iOS - swift] 2. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 기본 (stack, heap)

jake-kim 2023. 8. 12. 01:09

1. Swift 메모리 할당 - address 확인 방법, withUnsafePointer, Memory Graph Debugger, vmmap

2. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 기본 (stack, heap)

3. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 심화 (String타입, struct안에 class, class안에 struct)

4. Swift 메모리 할당 - MALLOC, MALLOC guard, dyld private memory, Shared memory, ColorSync (vmmap PID)

사전지식) 메모리 표현 식 (16진수, Byte, bit)

  • 0x16d2dc000의 의미?
    • 16진수(hexadecimal)로 표현된 메모리 주소
    • 16진수는 숫자 앞에 0x를 붙여서 표현

ex)  

  • 16진수: 한자리에 16개의 숫자 표현이 가능
  • 2진수: 한자리에 2개의 숫자 표현이 가능
  • 1바이트: 8진수 (한 자리에 8자리 표현이 가능)
  • 2바이트: 16진수 (한 자리에 16자리 표현이 가능)

16진수 이해하기 (출처: https://dean30.tistory.com/40)

  • 보통 메모리 주소를 표현할 때는 16진수로 총 16개로 표현하기 때문에, 앞에 0x를 붙여서 표현
  • 16진수 한 자리는 4개의 bit로 표현할 수 있으므로, 16진수 2개는 곧 8bit
  • 16진수 두 개씩 끊어서 보여주는 곳이 많은데 이유는 16진수 2개가 곧 1byte이므로 바이트 단위로 보기 위함

메모리 할당 위치 알아내기 (Stack vs Heap)

  • 예제로 사용할 proprety 준비
  • 이전 포스팅 글에서 알아본 vmmap <PID> | grep stack을 사용하여 stack 범위 확인
  • break point를 걸고 메모리 주소를 확인한 다음 이 메모리 주소가 stack영역에 포함되는지 확인

ex 1) Int 프로퍼티 메모리 할당 위치 파악하기

목적) Int 프로퍼티는 value type이므로 stack 메모리 영역에 위치할 것인데 이것을 직접 확인

  • 메모리 확인하는 함수 준비
@inlinable func printMemoryAddress<T>(_ o: inout T) {
    withUnsafePointer(to: &o) { print($0) }
}
  • 확인
    • PID 확인
    • intValue 주소 확인

  • 메모리 속 stack 주소 범위 확인
    • vmmap <PID> | grep Stack
vmmap 61064 | grep Stack

  • 해석
    • 스레드 0의 스택 영역의 크기는 56MB이며 주소 범위는 0x16b268000 ~ 0x16ba64000
    • 스레드 1의 스택 영역의 크기는 16k이며 주소 범위는 0x16baf4000 ~ 0x16bb7c000
    • 스레드 2의 스택 영역의 크기는 16k이며 주소 범위는 0x16bc0c000 ~ 0x16bc94000
  • 위 메모리 주소는 9자리로 나오는데, 보통 16진수로 표현하므로 0x가 앞에 붙이고 앞에 0을 붙여주어야함 (실제로는 16진수로 16개의 숫자로 표현)
    • 0이 암묵적으로 생략되어 있어서, 직접 7개를 붙여주어야 메모리 전체 주소
    • 16b858000 -> 0x000000016b858000
    • 표현 (16진수 두 개씩 끊어서 표현 2^8 즉 1byte): 00 00 00 01 6b 85 80 00
  • intValue 프로퍼티의 메모리 주소는 0x000000016ba5f8d0 이므로 이 값은 스레드 0의 스택 메모리 범위(0x16b268000 ~ 0x16ba64000) 에 속하므로 heap이 아닌 stack영역에 할당 확인이 가능

 

cf) Int 타입은 예상한대로 stack영역에 속하지만, String타입, struct안에 class가 있는 타입, class안에 struct가 있는 타입들은 어느 메모리 영역에 저장되는지 쉽게 예측이 불가능

Comments

jake-kim님의
글이 좋았다면 응원을 보내주세요!