[etc] 가비지 콜렉션 (Garbage Collection)

Date:     Updated:

카테고리:

태그:

이 글은 가비지 콜렉션를 공부하고 요약한 글이다.

가비지 콜렉션란?

  • 메모리 할당 후 사용이 끝난 메모리는 해제해주어야 한다
  • 해제해주는 작업을 자동으로 해주는 것이 가비지 콜렉션이다
  • 방식에는 크게 2가지가 존재한다
    • Reference Counting Algorithm
    • Tracing Garbage Collection

Reference Counting Algorithm

  • 참조 기반 알고리즘이다
  • 참조 횟수를 저장해 참조 횟수가 0이 되면(더이상 사용되지 않는다면) 메모리를 해제해준다
  • C++의 shared_ptr이 해당 방식을 채용하고 있다

장점

  • 구현이 매우 간단한 편이다
  • 사용되지 않을 때 바로 메모리를 해제해줌으로써 메모리의 낭비가 없다

단점

  • 참조 횟수를 기억 및 갱신하기 때문에 오버헤드가 발생
    • 매번 객체가 생성되거나 해제될 때 참조 횟수를 갱신시켜줘야 해서 오버헤드가 발생
    • 특히 멀티스레드 환경에서는 성능이 많이 떨어진다
  • 사용되지 않을 때 바로 해제해주기 때문에 Tracing Garbage Collection에 비해 전반적인 성능이 떨어질 수 있다
  • 순환 참조 문제로 메모리 누수가 생길 수 있다

Tracing Garbage Collection

  • 현재 할당된 모든 메모리를 확인해 사용되지 않는 메모리를 찾아 해제해주는 방식이다
  • root에서 접근이 되지 않는 메모리를 해제한다
    • root : 정적변수, 지역변수, 매개변수 등등…

Mark-Sweep Algorithm

  • Mark 단계 : root에서 접근 가능한 메모리를 Mark한다
    • 흰색 - 접근 못하는 메모리
    • 검정색 - 접근 가능한 메모리
  • Sweep 단계 : Mark가 안 된 메모리를 해제한다

장점

  • 순환 참조 문제가 발생하지 않는다

단점

  • 메모리 단편화 문제가 발생한다
  • 수집하는 단계에서 프로그램이 멈추기 때문에(stop the world) 실시간에서 뚝뚝 끊기는 문제가 발생한다

Mark-Sweep-Compact Algorithm

  • Mark-Sweep Algorithm 의 단점인 메모리 단편화 문제를 보안한 알고리즘이다
  • 사용 안되는 메모리를 해제하고 나머지 메모리를 압축시킨다

장점

  • 메모리 단편화 문제가 발생하지 않는다

단점

  • 메모리를 압축시키는 비용이 든다
  • 압축시키면 참조 주소(포인터)를 갱신시켜줘야 한다
    • 결국 오버헤드가 발생됨

Tri-color Marking Algorithm

  • 흰색, 검정색 말고도 회색을 추가해 중간에 수집을 멈추더라도 어디까지 수집했는지 파악할 수 있다

장점

  • 수집 과정을 여러번 나누어서 진행할 수 있다

단점

  • 기존에는 색 표현에 1비트만 사용됐는데 회색이 추가되면서 추가 메모리를 사용하게 된다

Copying Algorithm

  • 2개의 영역을 나누어서 메모리를 할당한다
  • 처음에는 A라는 영역에서 메모리를 할당하기 시작해서 메모리 수집을 해야할 때 A 영역에 있는 사용되는 모든 메모리를 영역 B로 복사한다
  • 복사한 이후 부터는 메모리 할당을 B에서 진행한다
  • A 영역에는 사용되지 않는 메모리만 남아있기 때문에 모두 해제한다

장점

  • 메모리 단편화 문제가 없다

단점

  • 메모리 복사에 대한 오버헤드가 발생됨
  • 참조 주소 갱신에 대한 오버헤드 발생함
  • 실제 사용할 수 있는 메모리는 절반이다
    • A 또는 B 영역만 사용하기 때문에

Generational Algorithm

출처



💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우 
  언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸

맨 위로 이동하기

etc 카테고리 내 다른 글 보러가기

댓글 남기기