가비지 컬렉터와 메모리 할당 전략
JVM
가비지 컬렉터와 메모리 할당 전략
가비지 컬렉션이 처리해야 하는 문제 3가지
- 어떤 메모리를 회수해야 하나?
- 언제 회수해야 할까?
- 어떻게 회수해야 할까?
어떤 대상이 죽었는지 판단하는 방법
참조 카운팅 알고리즘
자바 가상 머신에서 참조 카운팅을 사용하지 않지만 알아보자. 참조 카운팅은 아래와 같은 방식이다.
- 객체를 가리키는 참조 카운터(reference counter)를 추가한다. 참조하는 곳이 하나 늘어날 때마다 카운터 값을 1씩 증가시킨다.
- 참조하는 곳이 하나 사라질 때마다 카운터 값을 1씩 감소시킨다.
- 카운터 값이 0이 된 객체는 더는 사용할 수 없다.
참조 카운팅을 사용하면 순환 참조(circular refernce) 문제를 풀기 어렵다. 서로 참조하고 잇는 경우, 참조 카운터가 0이 되지 않지만, 그 상태로 객체 참조를 해제할 경우, 둘 다 카운터가 0이 아니기 때문에 순환참조가 걸린다.
도달 가능성 분석 알고리즘 (rechability analysis)
자바, C#은 이 알고리즘을 이용한다.
GC루트라고 하는 루트 객체들을 시작 노드 집합으로 쓴다. 시작 노드들에서 출발하는 참조하는 다른 객체들로 탐색해 들어간다. 탐색 과정에서 만들어지는 경로를 참조 체인(refernce chain)이라 한다. 어떤 객체와 GC루트 사이를 이어주는 참조 체인이 없다면, 즉 GC루트로부터 도달 불가능한 객체는 더 이상 사용할 수 없는게 확실해져 회수 대상이 된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
