가비지 컬렉션
- JVM의 Heap영역에서 동적으로 할당했던 메모리 중 필요없게 된 메모리 객체를 주기적으로 모아 제거하는 프로세스
- 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면, OutOfMemoryError가 발생할 수 있다
- 어떤 GC알고리즘을 사용하더라도 JVM이 GC를 실행하기 위해 애플리케이션 실행을 멈추게 되는데, 적절한 빈도의 GC가 실행되도록 하여 Stop-the-World 시간을 줄이는 것이 중요하다
JVM 메모리 구조와 Heap 구조
효율적인 메모리 관리를 위해, 객체의 생존 기간에 따라 물리적인 Heap 영역을 나누게 되었다
Young 영역
- 새롭게 생성된 객체가 할당되는 영역
- Minor GC라고 부른다
Old 영역
- Young영역에서 Reachable상태를 유지하여 살아남은 객체가 복사되는 영역
- Major GC라고 부른다
Minor GC 과정
- 생성된 객체 Eden 영역에 위치
- Eden 영역이 꽉차면 Minor GC가 발생
- Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사
- Survivor 영역도 가득차면 같은 방식으로 다른 survivor 영역에 복사하고 비움
- 이를 반복하다 보면 계속 살아남는 객체는 old 영역으로 이동
Major GC 과정
- Old 영역에 할당된 메모리가 허용치를 넘게 되면, 참조되지 않는 객체들을 한꺼번에 삭제
- Minor GC보다 시간이 오래걸림