-
java의 가비지 컬렉션 처리 방법
-
- GC 작업을 수행하는 가비지 콜렉터가 하는 일
- 메모리 할당
- 사용 중인 메모리 인식
- 미사용 메모리 인식
- Stop the World
- 자바 애플리케이션은 GC 실행 시 GC 실행 스레드를 제외한 모든 스레드를 멈추고, GC 완료 후 다시 스레드들을 실행 상태로 변경
- Stop the World는 모든 애플리케이션 스레드의 작업이 멈추는 상태
- 어떤 GC 알고리즘을 사용하더라도, Stop the World는 불가피하며 최소화하기 위해 GC 튜닝을 진행java의 가비지 컬렉션(Garbage Collection) 처리 방법
- 가비지 콜렉터가 들르는 메모리 영역은 Young 영역에 포함되는 Eden, Survivor1, Survivor2와 Old 영역 (Permanent 영역은 Java 1.8 부터 제거)
- Young 영역에 있는 객체는 각 하위 영역이 가득 차면 Miner GC가 동작하여 더이상 참조되지 않는 객체 제거
- Old 영역에 있는 객체는 영역이 가득 차면 Major GC(Full GC)가 동작하여 더이상 참조되지 않는 객체 제거
- 동작 과정
- 객체를 최초 생성하면 Young 영역 중 Eden 영역에 위치
- Eden 영역에서 Miner GC 발생 시, 참조 중인 객체라면 Survivor1로 이동
- Survivor1에서 Miner GC 발생 시, 참조 중인 객체라면 Survivor2로 이동
- Survivor2에서 Miner GC 발생 시, 참조 중인 객체라면 다시 Survivor1 영역으로 이동 (Survivor1 <--> 2 반복)
- Survivor 영역이 가득 차거나 Young 영역에서 오래 살아남은 객체는 Old 영역으로 이동
- '오래'의 기준은 객체마다 age bit라는 것을 가지고 있는데 이는 Miner GC에서 살아남은 횟수를 기록하는 값
- Old 영역에 있는 객체는 Major GC가 발생했을 때 참조 여부에 따라 공간이 유지되거나 제거