면접때 가비지 컬렉션 질문에 대답 못한 경험을 생각하며 정리한다.
1. Garbage Collection
자바는 다른언어와 달리 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문이다.
JVM의 Heap 영역은 2가지의 전제로 설계 되었다
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
다시 말해 객체는 대부분 일회성이며, 메모리에 오랫동안 남아 있는 경우는 드물다. 그래서 객체의 생존 기간에 따라 Heap 영역을 나누게 되었는데, 바로 Young, Old 영역이다.
Young 영역
- 새롭게 생성된 객체가 할당됨.
- 대부분의 객체가 금방 unreachable 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Young 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다.
Old 영역
- Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- 복사되며 기존 Young 영역보다 큰 메모리를 할당받게 된다.
- Old 영역에 대한 가비지 컬렉션을 Major GC 혹은 Full GC라고 부른다.
2. Garbage Collection의 동작 방식