728x90

단순 Reference Counting에는 순환 참조 문제가 있었고 이를 해결하기 위해 "약한 참조"를 활용한

 

방법을 보았는데요. 이 외에도 해결하는 방법중에는 garbage collection이 있습니다.

(사실 Reference Counting도 garbage collection의 일종입니다!)

 

보통 garbage collection 하면 포인터 추적 방식(Tracing Garbage Collection)을 생각하는데, 그 중에서 가장

 

간단한 Mark and Sweep방식을 소개 하고자 합니다.

 

장점

  - 비교적 알고리즘이 단순

단점

  - 메모리 파편화 문제 (Fragmentation)

  - Memory Corruption을 방지 하기 위해 Heap 사용을 제한해서 Suspend 현상이 생긴다 (예전 JVM ㅠ)

 

 

Mark and Sweep은 두 phase로 진행됩니다.

 

먼저 Mark phase 에서는 모든 object들의 header의 mark bit를 false로 만듭니다.

 

object들의 참조 상황

root object는 현재 바로 접근 가능한 object들로 구성됩니다.

  - 현재 스코프의 local 변수

  - 전역 변수

 

root object로부터 접근 가능한 모든 object들의 mark bit를 true로 바꿉니다.

참조 가능한 object들을 mark

이후 Sweep phase가 시작되어 mark 되어있지 않은 object들을 모두 쓸어(sweep)버립니다.

 

mark 되지 않은 object들을 sweep

이로써 순환 참조되어 있던 두 object가 간단히 제거 되었습니다.

 

Mark and Sweep은 단점으로 인해 그대로 사용하지는 않고, 개선된 알고리즘으로 GC를 진행합니다.

 

[참고]

ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

728x90

'프로그래밍' 카테고리의 다른 글

[Linux] 파일 디스크립터  (0) 2015.04.28
워게임&알고리즘은행 사이트들  (0) 2015.01.09

+ Recent posts