👋 들어가기 전
Swift를 주 언어로 사용하면서 ARC에 대한 내용은 많이 살펴봤지만 군대에서배운 나의 첫 언어
JAVA의 메모리 관리 도구인 GC(Garbage collector)에 대해서는 따로 깊게 알아보지 않았다.
이해하기 쉽게 ARC와 비교하며 이번 기회에 두개의 개념을 다시 정리해보자.
🗑️ ARC
먼저 익숙한 ARC 부터 살펴보자.
Automatic Reference Counting의 약자로 말그대로 자동적으로 참조 카운팅을 기반으로 메모리를
관리하는 기술이다.
🎉 등장 배경
Objective-C에서는 MRC(Manual Reference Counting)를 사용했다.
즉, 할당과 해제를 개발자가 직접해줬다.
하지만 휴먼에러가 발갱하는 위험이 있기 때문에 이 역할을 자동으로 하는 기술이 바로 ARC다.
🧪 동작 원리
ARC는 크게 참조 카운팅을 추적하여 해당 인스턴스를 해제할 지 유지할 지를 결정한다.
참조 카운팅이 변화하면 Swift 컴파일러는 retain/release 연산을 삽입하여 ARC를 구동한다.
런타임에 retain하면 참조 수가 증가하고, release하면 참조 수가 감소한다.
class A {
var propertyA: Int
init(propertyA: Int) {
self.propertyA = propertyA
}
}
// retain
var a = A(propertyA: 10)
a.propertyA = 20
// release
다음과 같이 인스턴스를 할당할 때 강한참조가 발생하므로 retain 연산을 통해 참조 카운트를 증가시키고
이후 더 이상 사용허지 않으므로 release 연산을 통해 참조카운트를 감소 시켜 할당을 해제시킨다.
🍎 장점 / 단점
장점
- 컴파일 타임의 작업이며, 컴파일 시점에 언제 참조되고 해제되는지 결정된다.
- 런타임 시점에 추가적인 오버헤드가 발생하지 않는다.
- 객체가 사용되지 않을 때, 실시간으로 메모리에서 release한다.
- 백그라운드 처리가 없으므로, 모바일 디바이스와 같은 저전력(lower-power) 시스템에서 더 효과적이다.
단점
- retain cycle(순환 참조)로 인해 메모리 누수가 발생할 수 있다.
🗑️ GC
ARC는 역시 많이 학습한 만큼 정리가 빠르게 됐다.
이번에는 GC를 같은 형식으로 정리해보며 차이점을 학습해보자.
🧪 동작 원리
GC는 ARC와 다르게 참조 관계를 그래프 관계를 통해 추적한다.
GC는 특정 객체가 garbage인지 아닌지 판단하기 위해서 도달성, 도달능력(Reachability) 이라는 개념을 적용한다.
도달(Reachable)이 가능한다면 래퍼런스가 존재하다는 뜻이고 도달 불가능(Unreachable)이면
래퍼런스가 존재하지 않기 때문에 GC에게 메모리를 반납해야하는 대상이다.
GC는 크게 3가지 동작을 통해 메모리를 관리한다.
1. Mark
Root로 부터 그래프를 순회하며 Reachable한 것과 Unreachable한 것을 구하는 과정이다.
2. Sweep
Unreachable한 객체들을 Heap에서 제거 (메모리 해제)
3. Compact
Sweep 과정에서 남은 Reachable한 레퍼런스를 Heap의 시작주소로 옮겨 메모리 할당된 부분과
할당되지 않은 부분을 구분하여 다음 순회 시 최적화를 노리는 작업
단, Compact는 GC에 따라 생략되는 과정일 수 있다.
☕️ 장점 / 단점
장점
- Mark & Sweep 방식을 통해 순환참조가 발샐하지 않는다.
- retain cycle을 포함하여 전체 객체 그래프를 관리할 수 있다.
단점
- 백그라운드에서 수행되므로, 객체의 정확한 release 시간을 알 수 없다.
- 정기적(런타임)으로 GC가 동작하여 background에서 동작하므로, 앱 성능 저하를 유발한다.
😀 소감 및 마무리
이번 기회에 정말 두개의 차이를 동작원리에서 잘 파악할 수 있었다.
하나는 counting 하나는 그래프를 사용한다는 것 또한 어느 시점에 해제를 알고 있는 지
즉, 컴파일 타임이냐 런타임이냐 .. 또 그에 따른 장/단점을 한번에 알 수 있었다.
보통 그래프는 PS를 위해 사용하기만 하고 면접이나 대화를 할 때 그래프를 실제 사용되는 곳은 어디일까요?
라는 질문을 어디서 본 것 같은데 JAVA를 안한지 오래되었고 Swift에서는 아직 그래프를 직접적으로
사용해보지 않아 대답을 못했었는데 이제는 자신있게 GC라고 대답할 수 있을 것 같다.
출처
'프로그래밍언어 > swift' 카테고리의 다른 글
Dynamic Key decoding (1) | 2024.12.21 |
---|---|
클로저와 self (0) | 2024.10.23 |
swift 기본 타입 (0) | 2024.10.18 |
디스패치 학습하기 (4) [ Extension Dispatch ] (0) | 2024.08.26 |
디스패치 학습하기 (3) [ Value Type Dispatch, Protocol Dispatch ] (0) | 2024.08.25 |