Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 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