effective-swift

Item 7. 다 쓴 객체 참조를 해제하라

Java의 Garbage Collection(GC)

img

이미지 출처: Naver D2

  1. 동작 방식

    • Java의 경우 JVM에 의해 힙(heap) 영역에 생성 객체가 할당됩니다.
    • JVM은 객체들이 더이상 코드에 참조되지 않을 때를 추적합니다.
    • GC는 Unreachable Objects들을 수거합니다.
    • Unreachable Objects: 유효한 최초의 참조(Root Set of References가 이루어지지 않는 객체)
    class A { 
      int i = 5; 
    }
    class B { 
      A a = new A(); 
    }
    class C {
       B b;
       public static void main(String args[]) {
          C c = new C();
          c.b = new B();
          // instance of A, B, and C created
          c.b = null;
          // instance of B and A eligible to be garbage collected.
    }
    
    • 런타임백그라운드에서 사용되지 않는 객체와 객체 그래프들(objects and object graphs)을 감지하는 방식으로 동작합니다. 이 동작은 일정 시간 경과한 뒤나 런타임 메모리가 낮아졌을 때 중간 간격(intermediate intervals)으로 발생하며 **정확한 순간에 해제되지 않습니다.**
    • GC는 사용자가 강제로 수행할 수 없고 언제 일어나는지도 불확실합니다.
    • GC는 객체를 메모리에서 제거하기 전에 해당 객체의 finalize( ) 메소드 호출합니다.
  2. 장단점

Swift의 Automatic Reference Counting(ARC)

: 객체의 레퍼런스 카운팅(reference counting, 참조 수)을 제공하는 메모리 관리 기법입니다.

../Art/ARC_Illustration.jpg

이미지 출처: Apple Documentation Archive

  1. 동작 방식
    • 레퍼런스 카운팅(Reference Counting)은 각 객체의 레퍼런스(= 참조)의 수를 계산하는 방식으로 동작합니다.
    • 런타임에 레퍼런스 카운트를 증가시키거나 감소시키는 메모리 참조나 해제 코드(retain이나 release)를 컴파일 때 컴파일러가 일정한 규칙에 의해 생성해 삽입하고(위 이미지 참고), 객체의 레퍼런스 카운트가 0에 도달했을 때 객체의 할당 해제를 표시합니다.
    • 개발자는 ARC가 언제 참조 카운트를 올리고 내리는지 규칙을 알고, 적절한 시점에 코드가 생성되도록 조절할 수 있습니다.
    • 레퍼런스 카운트가 0이 되면 그 객체는 확실히 접근할 수 없습니다(unreachable).
    • 런타임에 비동기적으로 객체를 제거합니다.
  2. 레퍼런스 카운팅 시점

img

이미지 출처: https://velog.io/@cskim

  1. 장단점

메모리 누수 (Memory Leak)

Weak 참조(약한 참조)와 Unowned 참조(미소유 참조)

  strong weak unowned
Reference Counting O X X
Variable(var) O O O
Constant(let) O X O
Optional O O X
Non-Optional O X O
Memory Release 명시적으로 nil 할당 auto deinit nil 할당 auto deinit 메모리 주소를 계속 갖고 있음
Expected Problem Strong Reference Cycle Memory Leak 인스턴스 해제 후 접근하면 nil 반환 인스턴스 해제 후 접근하면 오류 Dangling Pointer

참고

  1. Automatic Reference Counting - the swift programming language 5.3
  2. ARC vs. GC
  3. Garbage Collection vs Automatic Reference Counting
  4. [JAVA] Garbage Collection의 기초
  5. Java Reference와 GC
  6. ARC

이미지 출처

Strong 참조, Weak 참조, Unowned 참조 비교표 출처