1. 들어가며


가비지 컬렉션은 자바에서 처음 소개된 개념이 아니다. 동적 메모리 할당과 가비지 컬렉션 기술은 1960년대에도 존재했다. 가비지 컬렉션이 처리해야하는 문제는 세 가지인데 다음과 같다.

  1. 어떤 메모리를 회수해야 하나?
  2. 언제 회수해야 할까?
  3. 어떻게 회수해야 할까?

반세기 이상 지난 지금 동적 메모리 할당과 가비지 컬렉션 기술은 상당히 성숙했다. 그럼에도 우리가 가비지 컬렉션과 메모리 할당의 내부를 이해해야 하는 이유는 무엇일까?

다양한 메모리 오버플로와 누수 문제를 해결해야하는 상황이나 더 높은 동시성을 달성하는데 가비지 컬렉션이 방해가 되는 상황이 오면 자동화된 가비지 컬렉션 기술을 적절히 모니터링하고 조율할 수 있어야하기 때문이다.

자바의 힙과 메서드 영역은 메모리 요구량이 런타임에 동적으로 결정되는 경우가 많다. 프로그램이 어떤 객체를 생성할지, 얼마나 많이 만들지는 오직 런타임에만 알 수 있기 때문이다. 그래서 이 메모리 영역들의 할당과 회수는 동적으로 이루어진다. 가비지 컬렉션은 바로 이런 영역을 관리하는데 집중한다. 따라서 앞으로 메모리 할당과 회수라고 할 때의 메모리는 바로 이 영역들만 지칭한다.렉션은 바로 이런 영역을 관리하는데 지

2. 대상이 죽었는가?


자바에서 가비지 컬렉터가 힙을 청소하려면 어떤 객체가 살아있고 죽어있는가에 대한 판단을 해야한다. 이를 어떻게 판단할까?

2.1 참조 카운팅 알고리즘

참조 카운팅 알고리즘은 횟수를 세기 위해 약간의 메로리를 추가로 사용하지만 원리가 간단하고 객체 참조 여부를 판단하는 로직도 간단하다. 방식은 다음과 같다.

  1. 객체를 가리키는 참조 카운터를 추가한다. 참조하는 곳이 하나 늘어날 때마다 카운터 값을 1씩 증가시킨다.