GC 동작 방식
용어 정리
1. Mark : 접근 가능한 객체를 표시하는 것
2. Sweep : Mark되지 않은 객체들을 제거하는 것
3. Compact : Sweep과정에 의해 발생한 메모리 단편화를 모으는 것
4. Stop-the-world : GC가 실행되는 동안 모든 thread가 멈추게 되는 현상
동작 순서
- Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다.
- GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다.
- Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다.
GC 종류
1. Serial GC
- Single Thread GC로 가장 단순한 방식
- Single Thread라 느리고, Stop-the-world 시간이 길다.
Marwk-Sweep-Compact
알고리즘 사용
2. Parallel GC
- Java 8 default
- Young 영역의 GC를 Multi-thread로 처리
- Serial GC에 비해 Stop-the-world가 짧음
3. Parallel Old GC
- Parallel GC + Old 영역까지 Multi-thread 처리
-> 그럼, Parallel GC는 Old 영역 Single-thread 처리?
Mark-Summary-Compaction
알고리즘 사용
4. CMS GC
- Concurrent Mark Sweep GC
- Stop-the-world를 줄이고자 만듬
- Reachable 객체를 4단계에 걸쳐서 탐색
- compaction 작업을 필요한 경우만 진행
- 탐색 방법
- initial mark
(stop-the-world)
: GC Root가 참조하는 객체만 mark
- concurrent mark : 참조하는 객체를 따라가며, 지속적으로 mark
- remark
(stop-the-world)
: concurrent mark과정을 검증
- concurrent sweep : 객체 제거
5. G1 GC
- Garbage First GC
- stop-the-world가 가장 짧음
- CMS GC를 개선
- Heap 영역 전체를 region으로 나눠 관리
- humongous : region크기의 50%를 초과하는 큰 객체를 저장하는 공간
- available/unused : 아직 사용되지 않은 region
- 수행 방식
- young gc
- gc대상 객체가 많은 region에서 수행(어떻게 알고?)
- 살아남은 객체를 다른 region으로 옮김
- 비워진 region을 사용가능한 region으로 변경
- full gc
- initial mark : old region의 객체가 참조하는 survivor region을 찾음(stop-the-world)
- root region scan : 1번에서 참조된 객체를 scan
- concurrent mark : 전체 region scan
- remark : gc대상에서 살아남을 객체 식별(stop-the-world)
- cleanup : 살아 있는 객체가 적은 region에 대한 미사용 객체 제거 수행(stop-the-world)
- copy : cleanup과정에서 비워지지 않은 region의 살아남은 객체들을 새로운 region(avilable/unused)에 복사하여 compaction 작업 수행
References