자바의 heap을 관리해주는 Garbage Collector에 대해 알아보자
JVM 구조
- GC를 알아보기 위해 실행되는 환경인 JVM의 구조먼저 알아보야야한다.
- 메인이 되는 구성요소
- class loader
- runtime data area
- execution engine
- 성능에 직접적인 연관이 있는 구성요소

Automatic Garbage Collection?
작업 개요
- 사용하는 객체와 사용하지 않는 객체 구분
a. 사용중: 프로그램에서 객체가 referenced인 상태
b. 사용중이 아닌것: 프로그램 내부에서 전혀 reference되지 않은 상태
- 사용하지 않는 객체를 반환
실제 작업
- marking
- heap영역에서 사용중인 객체와 아닌 객체를 구분하는 작업

- Normal Deletion
- 사용중이지 않은 객체 제거
- Memory allocator가 객체가 제거된 빈 공간을 유지

2a. Deletion with Compacting
- 성능 향상을 위해 사용중인 heap을 compact하게 만든다

왜 GC를 사용하는가?
- 경험적 분석에 의하면 할당된 객체는 시간이 지날수록 사용되지 않는 통계가 있기 떄문
- 아래 표를 보면 minor GC와 major GC가 있다.

언제 GC가 사용되는가?
- 이 정보를 기반으로 heap을 나누면 다음과 같다.
- young generation
a. 새로운 객체가 할당되는 영역
b. 이 영역이 가득 차면 minor GC 실행되며 이 영역이 관리됨
c. minor GC이후에도 살아있는 객체는 old generation으로 이동
- old generation
a. 오랫동안 사용된 객체를 저장하는 공간
b. 이 영역이 수거되는 작업이 major GC다.
- permanent generation
a.메타데이터 저장장소

stop the world
a. 모든 minor GC와 major GC는 모든 어플리케이션 스레드를 중단하는 "Stop the world"이다.
b. major GC에는 사용중인 객체도 포함되어있기에 더 오래걸린다.
c. 반응형 앱에서는 major GC를 최소화 해야함
출처
Java GC 오라클 공식문서