Dart에서 기본적으로 제공하는 Garbage Colletion 은 메모리를 조금 더 효율적으로 사용할 수 있게 제공하는 메모리 관리 프로세스이다.
이전에 공부한 경험이 있는 언어인 Swift에서는 ARC(자동 참조 카운팅)를 활용해 자동으로 메모리를 관리해주었는데 Dart에서는 해당 역할을 Garbage Collection이 수행하는 것 같다.
아래는 Garbage Collection에 대해서 알아본 바를 작성하고, ARC와 어떤 점이 다른지 비교해보았다.
Garbage Collection의 작동원리
1. 객체 생성
: Dart에서는 객체가 동적으로 생성될 때 메모리가 할당된다.
2. 참조 관리
: 객체는 다른 변수나 객체에 의해 참조 되어진다. 이러한 참조들을 통해 객체에 접근할 수 있다.
3. 사용되지 않는 객체
: 런타임 동안 객체가 더 이상 참조되지 않는 경우, 해당 객체는 더 이상 필요하지 않은 것으로 간주되어 메모리에서 해제된다.
사용되지 않는다에 대한 기준 ( 도달 가능성 <reachability> )
1. 참조 카운팅 - 참조 카운트가 0이 되면 도달 가능성(reachability)가 없다고 판단한다.
2. 도달성 분석 - 객체 간의 참조 그래프에서 Root에서 부터 도달할 수 없는 객체에 대해서 도달 가능성(reachability)가 없다고 판단한다.
4. 가비지 컬렉션 실행
: 일정 시간 혹은 메모리가 일정량 이상 사용되었을 때, 가비지 컬렉션 프로세스가 실행된다. 이 프로세스는 더 이상 참조되지 않는 객체들을 식별하고, 해당 객체들의 메모리를 해제한다.
5. 메모리 해제
: 가비지 컬렉션에 의해 식별된 객체들의 메모리는 자동으로 해제된다.
ARC 와의 유사성과 차이점
1. 유사성
- 자동 메모리 관리를 위한 개념이다.
- 메모리를 해제하는 원리에 참조라는 개념을 두었다.
2. 차이점
- ARC는 메모리 해제를 위해 참조 개수를 추적하는 반면, Garbage Collection 방식은 조금 더 일반적인 방식으로 참조 개수 이외의 다양한 메모리 관리 방식을 갖는다.
- 기본적으로 많은 측면을 고려하기에 Garbage Collection이 조금 더 순환 참조를 잘 처리한다고 하지만, 기본적으로 사용되는 cost가 더 크기 때문에 어떤 것이 더 좋은 방식이라고 확언하기 힘들 것 같다.
개발 시, 고려해야 할 점
1. 메모리 관리의 자동화
- 객체의 참조를 통해 메모리 관리의 자동화가 이뤄지고 있다는 사실을 인지하고 있어야 한다.
- 즉, 너무 복잡한 참조 관계는 메모리 해제에 있어 장애를 가져올 수 있다는 사실을 알고 있어야 한다.
2. 순환 참조 방지 (메모리 누수)
- 객체가 서로를 참조하고 있는 경우 한 쪽이 메모리에서 해제되는 경우
class A {
B b;
}
class B {
A a;
}
A objA = A();
B objB = B();
objA.b = objB;
objB.a = objA;
// objA와 objB는 더 이상 사용되지 않음
objA = null;
objB = null;
- 스스로를 참조하는 경우
class Node {
Node next;
}
Node node = Node();
node.next = node;
- 클로저(Closure)에 외부 변수를 캡쳐하는 경우
void main() {
var myList = [1, 2, 3];
var myClosure = () {
print(myList);
};
myClosure();
}
: 클로저가 사용되는 동안 외부 변수가 참조되어 있는 상태인데, myList 객체를 메모리에서 해제하려고 시도한 경우 참조 관계에 의해 메모리에서 해제되지 않을 수 있다.
'Flutter > Basic Knowledge' 카테고리의 다른 글
[Dart] Stream 이란? (2) | 2024.01.22 |
---|---|
[Dart] Asynchronous & Future (0) | 2024.01.12 |
[Dart] 단일 상속과 Mixin (0) | 2024.01.10 |
[Dart] AOT(Ahead-Of-Time) 과 JIT(Just-In-Time) 컴파일러 (0) | 2024.01.10 |
[Dart] Dart 란? (0) | 2024.01.10 |