[Dart] Garbage Collection 이란?

2024. 1. 10. 11:44·Flutter/Basic Knowledge

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  (3) 2024.01.12
[Dart] 단일 상속과 Mixin  (1) 2024.01.10
[Dart] AOT(Ahead-Of-Time) 과 JIT(Just-In-Time) 컴파일러  (1) 2024.01.10
[Dart] Dart 란?  (1) 2024.01.10
'Flutter/Basic Knowledge' 카테고리의 다른 글
  • [Dart] Asynchronous & Future
  • [Dart] 단일 상속과 Mixin
  • [Dart] AOT(Ahead-Of-Time) 과 JIT(Just-In-Time) 컴파일러
  • [Dart] Dart 란?
halfcodx
halfcodx
iOS, Flutter Developer
  • halfcodx
    Mins_Programming
    halfcodx
  • 전체
    오늘
    어제
    • 분류 전체보기 (28)
      • My App (1)
        • NostelgiAlbum (0)
        • Ro_ad (1)
        • Growith (0)
      • Retrospect (2)
      • iOS (9)
        • iOS (6)
        • Swift (2)
      • Python (5)
        • Module (3)
        • Knowledge (2)
      • Flutter (10)
        • Basic Knowledge (10)
        • Implementation (0)
  • 블로그 메뉴

    • Home
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    combine 이란
    오블완
    combine
    티스토리챌린지
    Flutter
    requests
    DART
    파이썬
    ios combine
  • hELLO· Designed By정상우.v4.10.1
halfcodx
[Dart] Garbage Collection 이란?
상단으로

티스토리툴바