감상문
GC(Java)
ihl
2021. 10. 11. 20:55
- GC : Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스
- Heap: Object 타입의 객체들
- Heap의 구조
- Young Generation : 새로운 객체들이 할당되는 영역
- Eden
- Suvivor 0, 1
- Survivor 0, 1 둘 중 하나의 영역은 비어있어야 한다.
- Old Generagtion : 오랫동안 수거되지 않고 살아남은 객체들이 존재하는 영영
- Young Generation : 새로운 객체들이 할당되는 영역
- meta space : GC 시에 필요한 클래스와 메서드의 요약정보가 있는 영역
- GC의 수거대상 판별
- GC의 루트로부터 참조하고 있는 객체들을 하나씩 탐색해나간다.
- GC의 Root : Stack 영역 데이터, Method 영역의 Static 데이터, JNI에 의해 생성된 객체
- 어떤 객체에 유효한 참조가 존재한다면 Reachable, 그렇지 않다면 Unreachable이라 한다.
- Unreachable한 객체는 GC가 수거한다.
- GC의 루트로부터 참조하고 있는 객체들을 하나씩 탐색해나간다.
- GC의 알고리즘
- Mark
- GC Root로부터 모든 변수를 스캔하면서 수거 대상을 찾아 마킹한다.
- Sweep
- GC의 수거 대상들을 Heap에서 제거
- Compact
- Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리 단편화를 막는다.
- Mark
- GC 동작의 전제 조건
- 대부분의 객체는 금방 UnReachable한 상태가 된다.
- -> Minor GC는 많은 Garbage를 수거하므로 자주 일어나도 괜찮다.
- -> Major GC는 상대적으로 Garbage를 수거하므로 적게 발생시켜야 한다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
- 대부분의 객체는 금방 UnReachable한 상태가 된다.
- GC의 동작
- 새로운 객체가 Young Generation의 Eden에 할당된다.
- Eden에 더이상 할당할 공간이 없다면 Minor GC 발생
- Reachable / Unreachable 판별
- Reachable 객체는 Survivor 0영역으로 이동 후 age 값을 증가시킨다.
- Unreachable 객체는 제거된다.
- Eden에 더이상 할당할 공간이 없다면 Minor GC 발생
- 새로운 객체가 Young Generation의 Eden에 할당된다. 반복
- Eden에 더이상 할당할 공간이 없다면 Minor GC 발생
- Reachable / Unreachable 판별
- Reachable 객체는 Survivor 1영역으로 이동 후 age 값을 증가시킨다.
- Unreachable 객체는 제거된다.
- Eden에 더이상 할당할 공간이 없다면 Minor GC 발생
- age가 특정 임계점에 도달한 객체들은 Old Generation으로 이동한다.
- Old Generation이 꽉 차면 Major GC 발생
- 새로운 객체가 Young Generation의 Eden에 할당된다.
- Stop the World : GC를 실행하기 위해 애플리케이션 실행을 멈추는 것
- GC 외의 모든 작업을 중단한다.