ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메모리 구조 & ARC
    Swift 2021. 1. 11. 17:56

    안녕하세요. 그린입니다!

    이번 포스팅에서는 메모리 구조와 ARC에 대해 알아보겠습니다..!

     

    1. 메모리 구조

    [메모리 구조 화면]

    1) 코드 영역: 소스코드 기계어 형태 저장(0과 1), 컴파일 타입 결정, Read-Only 형태로 저장

    2) 데이터 영역: 프로그램 시작 시 할당, 종료 시 메모리 해제, Read-Write로 지정 (실행 도중 값 변경될 수 있음)

    3) 힙 영역

       (1) 프로그래머가 할당/해제해주는 영역

       (2) 메모리 해제 해주지 않으면 memory leak 발생 (동일 메모리 블록 중복 할당 방지 필요) - malloc, calloc 등 해제 기능 필요

       (3) 런타임 시 결정되기에 데이터 크기 확실치 않을때 사용

       (4) 클래스 인스턴스, 클로저 같은 참조 타입의 값은 모두 heap 영역에 자동 할당 (동적 할당)

       (5) 속도 저하 문제 발생 가능성 농후

    4) 스택 영역

       (1) 함수 호출 시 저장,할당 및 함수 종료 시 해제됨

       (2) LIFO 구조

       (3) 속도가 빠름

       (4) 메모리 크기 제한이 있음

       (5) 지역 변수만 접근 가능

     

    -. 힙,스택은 같은 메모리 영역 공유

       (1) 힙 영역이 스택 영역 침범: 힙 오버 플로우

       (2) 스택 영역이 힙 영역 침범: 스택 오버 플로우

     -. 데이터의 크기를 모르거나 스택에 저장하기에 큰 데이터 일 시 heap 영역 할당이 적절 (그 외 stack 할당 적절)

     

     -. 메모리 관리를 해야하는 이유?

      1) 앱 성능 효율적 관리

      2) 메모리 충돌 방지 및 해결

     

     -.  문자열은 주로 가변적인 길이로 heap 메모리에 저장

     

     -. 구조체/클래스라고 무조건 힙/스택 등 지정된 영역에서 동작하는것이 아님

         (Int, Double 등 대체적으로 stack 영역에 저장되지만 아닌 경우도 있음) --> mutating, inout 키워드 사용 시

     

    2. ARC

     : Automatic Reference Counting의 약자로 자동 참조 계수를 뜻한다.

     -. 객체의 참조가 사용되고 있는지 추적하기 위한 장치

    -. 클래스의 인스턴스에서만 적용

    -. 객체 생성 및 공유 시 마다 카운터(참조횟수)를 업데이트 해줌

    -. 참조타입의 할당 및 해제 시점을 자동으로 관리

    -. 해제 시점이 컴파일 시 정해져 있음

     

    1) 강한참조: 프로퍼티, 변수, 상수에 대해 기본값으로 설정되어 있는 참조 옵션

     -. 참조횟수 0일시 해제되고 디이니셜라이저가 호출된다 (자동)

     -. 여러개의 인스턴스가 서로 참조할 시 강한 참조 순환 문제 발생 가능성이 있다.

     -. 메모리 해제 시점에 대한 이해가 없이 사용 시 인스턴스가 영원히 메모리에서 해제 되지 않기에 메모리 누수가 발생할 수 있음

        (약한참조 혹은 미소유참조로 해결할 수 있음)

     

    2) 약한참조: weak 옵션 키워드를 붙여 생성한다.

     -. 자신이 참조하는 인스턴스의 참조횟수를 증가시키지 않음

     -. 항상 옵셔널로 사용

     

    3) 미소유참조: unowned 옵션 키워드를 붙여 생성한다.

     -. 참조하는 인스턴스가 항상 메모리에 존재할거라는 기반을 가지고 사용

     

    Question 1) ARC 이전 메모리 관리에 대해?

     -. MRC, MRR 등 개발자가 수동으로 직접 메모리를 관리해주었다.

    Question 2) 레퍼런스 카운팅을 하는 이유?

     -. 참조의 시점을 알기 위해

     

    [참고자료]

    https://jiyeonlab.tistory.com/34

    https://selfish-developer.com/entry/스택--코드-데이터영역

    야곰의 스위프트 프로그래밍(3판)

     

    이상으로 메모리구조와 ARC에 대해 알아봤습니다.

    특히 ARC는 Swift 기술의 꽃이라 불립니다. 다른 언어에 없는 독창적인 것으로

    자바의 가비지 컬렉션 기법과 다름으로 더 메모리 해제 시점과 관련하여 정확한 이해가 필요합니다.

    감사합니다 :D

    'Swift' 카테고리의 다른 글

    온도 표현단위와 변환 방법  (0) 2021.01.19
    CFAbsolute TimeGetCurrent  (0) 2021.01.15
    Concurrent Programming  (0) 2021.01.07
    인스턴스 생성 및 소멸  (0) 2020.12.28
    JSON 데이터 다루기  (0) 2020.12.23
Designed by Tistory.