본문 바로가기
Swift/Basic

Memory Management

by songmoro 2024. 10. 31.
728x90

Automatic Reference Counting

  • Swift의 메모리 사용량을 추적하고 관리하는 기법
  • 인스턴스가 필요하지 않을 때, 클래스 인스턴스가 사용하는 메모리를 자동으로 해제
  • 클래스의 인스턴스에만 적용
    • 구조체와 열거형은 값 타입으로 참조로 저장 및 전달되지 않음
  • 작동 방식
    • 클래스의 인스턴스를 생성할 때, ARC는 메모리를 할당
      • 인스턴스와 관련된 저장 프로퍼티의 값, 인스턴스 타입에 대한 정보 저장
    • 인스턴스가 더 이상 필요하지 않을 때, ARC는 메모리를 비움
  • 인스턴스가 필요한지 확인하기 위해 클래스 인스턴스를 속성, 상수, 변수에 할당할 때마다 인스턴스에 대한 strong 참조를 만듦
  • weak 참조
    • 참조 횟수를 증가시키지 않음
    • 참조되는 인스턴스가 참조하는 인스턴스보다 수명이 짧은 경우 사용
    • 오버헤드 발생
      • weak 하게 참조될 때, weak reference storage 할당
      • 32 바이트의 메모리 비용
      • 런타임 비용 최대 10배
  • unowned 참조
    • weak 참조의 강제 언래핑 버전
    • 참조되는 인스턴스가 참조하는 인스턴스보다 수명이 비슷하거나 더 길 때 사용
    • 오버헤드 없음
      • 메모리 비용 없음
      • 런타임 비용 최대 4배
    • 참조하는 대상은 unowned가 존재하면 할당 해제될 수 없다.
      • 메모리 낭비 발생
      • 참조하는 대상의 수명이 얼마나 될지 모른다면, weak 참조를 통해 오버헤드를 감수할 만 함

 

Memory Reachability

  • 힙에는 3개의 메모리 종류가 있음
  • Useful memory: 재사용되며 도달 가능한 메모리
  • Abandoned memory: 재사용되며 도달 가능하지만 사용되지 않는 메모리
  • Leaked memory: 재사용되지 않고 도달 불가능한 메모리

 

Memory Leak

  • 메모리에 할당되었지만 반환되지 않고, 참조되지 않는 것
  • 참조할 수 없기 때문에 반환할 수 없음

 

Retain Cycle

  • 인스턴스가 할당 해제되지 않도록 참조 상 순환을 이루는 상태
  • 둘 이상의 인스턴스가 서로에 대한 strong 참조를 보유할 때 발생

 

Copy on Write

  • 프로퍼티를 복사할 때, 데이터를 복사하는 대신 동일한 저장 공간을 공유하고 있다가 수정이 생길 때 별도의 복사본을 만드는 방법
  • 데이터를 복사하는 대신 필요한 시점에 복사하기 때문에 메모리를 효율적으로 사용
  • 대용량 데이터나 공유 자원을 다룰 때 유용

 

 

728x90

'Swift > Basic' 카테고리의 다른 글

Data Type  (0) 2024.11.07
Concurrency  (0) 2024.11.07
GCD  (0) 2024.10.31
Memory  (0) 2024.10.31
Thread  (0) 2024.10.31