Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iOS에서 자동 참조 카운팅(ARC)과 가비지 컬렉션(Garbage Collection)의 차이점에 대해 설명해주세요. #14

Open
ujhong7 opened this issue Sep 29, 2024 · 0 comments

Comments

@ujhong7
Copy link
Owner

ujhong7 commented Sep 29, 2024

자동 참조 카운팅(ARC)과 가비지 컬렉션(Garbage Collection)은 메모리 관리를 자동화하는 방식입니다.
하지만 그 동작 방식과 목적은 다릅니다.

  1. 자동 참조 카운팅(ARC):
  • 작동 원리: ARC는 컴파일 타임에 메모리를 관리하는 방식으로, 객체에 대한 참조(레퍼런스) 카운트를 추적합니다.
    각 객체는 참조 카운트가 증가하거나 감소하며, 카운트가 0이 되면 해당 객체가 메모리에서 자동으로 해제됩니다.

  • 동작 시점: 참조가 추가되거나 해제될 때마다 실시간으로 카운트를 업데이트하고, 참조 카운트가 0이 되는 즉시 객체가 메모리에서 해제됩니다.\

  • 제어 방식: ARC는 컴파일러가 메모리 관리 코드를 자동으로 삽입하지만, 메모리 해제는 명시적으로 참조가 없어질 때만 일어납니다.

  1. 가비지 컬렉션(Garbage Collection):
  • 작동 원리: 가비지 컬렉션은 메모리에서 더 이상 사용되지 않는 객체들을 주기적으로 찾아서 자동으로 해제하는 방식입니다.
    일반적으로 마크 앤 스윕(Mark and Sweep) 같은 알고리즘을 사용해, 참조되지 않는 객체들을 탐지하고 제거합니다.

  • 동작 시점: 메모리 부족 시나 특정 주기마다 가비지 컬렉터가 실행되어 메모리를 청소합니다.

  • 제어 방식: 개발자가 직접 메모리 해제를 신경 쓸 필요가 없고,
    가비지 컬렉터가 주기적으로 동작하면서 불필요한 객체를 찾아 메모리를 해제합니다.

차이점 요약:

ARC는 참조 카운트를 기반으로 실시간으로 메모리를 해제하고,

가비지 컬렉션은 주기적으로 실행되어 참조되지 않는 객체들을 찾아 해제합니다.

ARC는 더 예측 가능한 메모리 관리를 제공하는 반면,

가비지 컬렉션은 백그라운드에서 메모리 관리 작업을 실행하므로 성능에 영향을 줄 수 있습니다.


🟡 가비지 컬렉션의 동작 원리와 장단점에 대해 설명해주세요.

동작 원리:
가비지 컬렉션은 주기적으로 객체들을 추적하여
사용되지 않는 객체(즉, 참조되지 않는 객체)를 찾아내고 메모리에서 해제하는 방식입니다.
가비지 컬렉션의 대표적인 알고리즘으로는 Mark-and-Sweep이 있습니다.

Mark (마킹): 모든 객체를 추적하면서, 여전히 참조되고 있는 객체를 찾아 마크합니다.
Sweep (제거): 마크되지 않은 객체를 메모리에서 해제하여 공간을 확보합니다.

장점:

  • 메모리 관리 자동화: 개발자가 객체 해제를 직접 신경 쓸 필요 없이 가비지 컬렉터가 주기적으로 불필요한 객체를 제거합니다.

  • 메모리 누수 방지: 잘못된 메모리 해제(예: 메모리 누수)와 같은 문제를 예방하는 데 유리합니다.
    참조가 남아 있지 않은 객체는 자동으로 처리되기 때문에 실수로 메모리를 누수하는 일이 줄어듭니다.

  • 개발자 부담 감소: 개발자가 메모리 해제를 신경 쓰지 않아도 되므로 코드가 간결해집니다.

단점:

  • 성능 이슈: 가비지 컬렉터는 특정 시점에 실행되므로, 애플리케이션 성능에 영향을 줄 수 있습니다.
    특히, 대규모 메모리 관리 작업이 수행될 때 앱의 응답성이 떨어질 수 있습니다.

  • 예측 불가능한 타이밍: 가비지 컬렉션은 주기적으로 실행되므로, 언제 메모리 해제가 이루어질지 예측하기 어렵습니다.
    이로 인해 메모리 해제가 필요한 시점보다 늦게 해제되는 경우가 발생할 수 있습니다.

  • 실시간 애플리케이션에 부적합: 실시간 성능이 중요한 애플리케이션(예: 게임)에서는 가비지 컬렉션이 성능 저하를 유발할 수 있어 적합하지 않습니다.

🟡 iOS에서 가비지 컬렉션을 사용하지 않는 이유와 ARC를 선택한 배경에 대해 설명해주세요.

  • iOS에서 가비지 컬렉션을 사용하지 않는 이유:

    • 실시간 성능 요구: iOS 애플리케이션은 사용자 인터페이스(UI)가 중요한 실시간 성능을 요구합니다.
      가비지 컬렉션은 예측 불가능한 시점에 실행되며, 실행 도중 애플리케이션의 성능이 저하될 수 있습니다.
      이러한 성능 문제는 사용자가 즉각적인 반응을 기대하는 iOS 애플리케이션에서 큰 문제를 일으킬 수 있습니다.

    • 모바일 환경의 제약: iOS 장치는 메모리와 CPU 자원이 제한된 모바일 장치입니다.
      가비지 컬렉터는 백그라운드에서 메모리 관리 작업을 실행하므로, 불필요한 리소스를 소모하게 됩니다.
      이러한 리소스 소비는 배터리 수명이나 전체 성능에 부정적인 영향을 미칠 수 있습니다.

    • ARC의 효율성: ARC는 컴파일 타임에 메모리 해제를 결정하고, 실시간으로 메모리 관리를 수행하므로
      가비지 컬렉션처럼 주기적인 성능 저하 없이 메모리를 효율적으로 관리할 수 있습니다.
      또한, ARC는 가비지 컬렉션에 비해 더 가벼운 방식으로 메모리 관리를 제공하기 때문에 iOS의 요구 사항에 적합합니다.

  • ARC를 선택한 배경:

    • 성능: ARC는 참조 카운트를 기반으로 실시간으로 메모리를 관리하므로,
      성능 저하 없이 예측 가능하고 효율적인 메모리 관리를 보장합니다.
      가비지 컬렉션처럼 메모리 정리를 위한 별도의 시간을 기다리지 않고, 즉시 메모리 해제를 처리할 수 있습니다.

    • 모바일 환경에 최적화: iOS는 모바일 장치로, CPU와 메모리 자원이 제한적입니다.
      ARC는 참조 카운트가 0이 되는 즉시 객체를 메모리에서 해제하여, 불필요한 리소스 사용을 줄입니다.
      이로 인해 배터리 수명과 성능 유지에 도움이 됩니다.

    • 개발자 친화적: ARC는 개발자가 수동으로 메모리 관리를 신경 쓰지 않아도 자동으로 메모리를 관리해 줍니다.
      컴파일 타임에 자동으로 메모리 관리 코드를 삽입해 주기 때문에, 개발자는 명시적으로 retain이나 release를 호출할 필요가 없습니다.
      이는 코드 유지보수성과 안전성을 높입니다.

    • 멀티스레드 환경: Swift의 ARC는 멀티스레드 환경에서 안전하게 동작할 수 있도록 설계되어 있어,
      별도의 락(lock)이나 동기화를 추가로 고려할 필요가 없습니다.


정리

  • ARC는 객체의 참조 카운트를 추적해 참조 카운트가 0이 되면 객체를 메모리에서 해제하는 방식이고,
    가비지 컬렉션은 참조되지 않는 객체를 주기적으로 찾아 제거하는 방식입니다.

  • 가비지 컬렉션은 메모리 관리가 자동화되지만, 성능 저하와 예측 불가능한 메모리 해제 타이밍이 단점입니다.

  • iOS는 실시간 성능이 중요하고 모바일 환경에 최적화된 메모리 관리가 필요하기 때문에, 성능 저하 없이 효율적인 ARC를 채택했습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant