단순 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로 만듭니다.
root object는 현재 바로 접근 가능한 object들로 구성됩니다.
- 현재 스코프의 local 변수
- 전역 변수
root object로부터 접근 가능한 모든 object들의 mark bit를 true로 바꿉니다.
이후 Sweep phase가 시작되어 mark 되어있지 않은 object들을 모두 쓸어(sweep)버립니다.
이로써 순환 참조되어 있던 두 object가 간단히 제거 되었습니다.
Mark and Sweep은 단점으로 인해 그대로 사용하지는 않고, 개선된 알고리즘으로 GC를 진행합니다.
[참고]
'프로그래밍' 카테고리의 다른 글
[Linux] 파일 디스크립터 (0) | 2015.04.28 |
---|---|
워게임&알고리즘은행 사이트들 (0) | 2015.01.09 |