[etc] 가비지 콜렉션 (Garbage Collection)
카테고리: etc
이 글은 가비지 콜렉션를 공부하고 요약한 글이다.
가비지 콜렉션란?
- 메모리 할당 후 사용이 끝난 메모리는 해제해주어야 한다
- 해제해주는 작업을 자동으로 해주는 것이 가비지 콜렉션이다
- 방식에는 크게 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
출처
💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸
댓글 남기기