GC엔 여러 종류가 있다.
모든 java구현체에 GC가 있는건 아니다
➡️ GC는 탈착형 서브시스템으로 취급된다
GC 선정 시 고려해야 할 것!
관심사와 trade off를 고려해여 수집기를 선택해야 한다
동시 수집기를 써서 application thread 실행 도중 수집에 필요한 작업 일부를 수행해서 중단 시간을 줄이는 것도 방법이다
STW GC를 실행하려면 application thread를 모두 중단시켜야 한다.
JVM이 이런 작업을 어떻게 수행하는걸까?
➡️ application thread 마다 savepoint라는 특별한 실행 지점을 둔다
➡️ GC가 수행되기 전과 같은 중요한 작업을 실행하기 전에, 모든 애플리케이션 스레드를 일시 정지시키는 지점을 말한다
➡️ savepoint time flag를 세팅하면 모든 application thread는 반드시 멈추야 한다
savepoint는 GC 수행을 위해 모든 application thread를 중지 시키는 지점이다.
모두 중지시키고 난 후, 삼색마킹 알고리즘을 실행한다
삼색마킹 알고리즘에 사용되는 color
- White: 아직 접근되지 않은, 즉 가비지 컬렉터가 아직 방문하지 않은 객체들을 나타냄. 이 객체들은 잠재적으로 가비지일 수 있다
- Gray: 가비지 컬렉터가 방문했지만, 그 객체가 참조하는 다른 객체들을 아직 모두 검사하지 않은 상태. 즉, 이 객체는 살아있지만, 그 참조가 가리키는 객체들이 아직 검사 대기 상태
- Black: 해당 객체와 그 객체가 참조하는 모든 객체들이 가비지 컬렉터에 의해 검사된 상태. 이는 더 이상 검사할 필요가 없는, 살아 있는 객체를 의미

(출처: JVM Garbage Collection(GC))
동시 수집을 하기 때문에, 변경자 thread(application thread)가 삼색마킹 알고리즘을 수행하는 동안 새 객체를 생성할 수 있다
중단 시간을 아주 짧게 하려고 설계된 테뉴어드 공간 전용 수집기 이다.
마킹은 삼색 마킹 알고리즘을 따른다
➡️ 수집기가 heap을 탐색하는 도중 객체 그래프가 변경될 수 있다
➡️ 초기 수행 단계가 복잡하다
- 초기 마킹(STW): GC 출발점을 얻는 것
- 동시 마킹: 삼색마킹 알고리즘 적용
- 동시 사전 정리
- 재마킹
- 동시 스위프
- 동시 리셋
CMS는 application thread와 동시에 작동한다
CMS 실행 도중 에덴 공간이 다 차버리면?
➡️ application thread가 더 이상 진행할 수 없으니 실행이 중단되고, CMS 도중 영 GC가 일어난다
영 GC 이후, 일부 객체는 테뉴어드로 승격된다
CMS 실행동안에도 승격된 객체는 테뉴어드로 이동해야 한다
➡️ 두 수집기 간 긴밀한 조정이 필요하다
할당률이 급증하면 영 GC 수행 시, 조기 승격이 일어난다
➡️ 테뉴어드 공간이 부족해진다
➡️ 동시 모드 실패(CMF) 라고 부른다
동시 모드 실패가 일어나는 원인

$ -XX:+UseConcMarkSweepGC
플래그로 작동한다