GC 종류

Sixhustle·2021년 12월 24일
0

Java

목록 보기
6/10

GC 동작 방식

용어 정리

1. Mark : 접근 가능한 객체를 표시하는 것
2. Sweep : Mark되지 않은 객체들을 제거하는 것
3. Compact : Sweep과정에 의해 발생한 메모리 단편화를 모으는 것
4. Stop-the-world : GC가 실행되는 동안 모든 thread가 멈추게 되는 현상

동작 순서

  1. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다.
  2. GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다.
  3. Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다.

GC 종류

1. Serial GC

  1. Single Thread GC로 가장 단순한 방식
  2. Single Thread라 느리고, Stop-the-world 시간이 길다.
  3. Marwk-Sweep-Compact 알고리즘 사용

2. Parallel GC

  1. Java 8 default
  2. Young 영역의 GC를 Multi-thread로 처리
  3. Serial GC에 비해 Stop-the-world가 짧음

3. Parallel Old GC

  1. Parallel GC + Old 영역까지 Multi-thread 처리
    -> 그럼, Parallel GC는 Old 영역 Single-thread 처리?
  2. Mark-Summary-Compaction 알고리즘 사용

4. CMS GC

  1. Concurrent Mark Sweep GC
  2. Stop-the-world를 줄이고자 만듬
  3. Reachable 객체를 4단계에 걸쳐서 탐색
  4. compaction 작업을 필요한 경우만 진행
  5. 탐색 방법
    1. initial mark (stop-the-world) : GC Root가 참조하는 객체만 mark
    2. concurrent mark : 참조하는 객체를 따라가며, 지속적으로 mark
    3. remark (stop-the-world) : concurrent mark과정을 검증
    4. concurrent sweep : 객체 제거

5. G1 GC

  1. Garbage First GC
  2. stop-the-world가 가장 짧음
  3. CMS GC를 개선
  4. Heap 영역 전체를 region으로 나눠 관리
    1. humongous : region크기의 50%를 초과하는 큰 객체를 저장하는 공간
    2. available/unused : 아직 사용되지 않은 region
  5. 수행 방식
    1. young gc
      1. gc대상 객체가 많은 region에서 수행(어떻게 알고?)
      2. 살아남은 객체를 다른 region으로 옮김
      3. 비워진 region을 사용가능한 region으로 변경
    2. full gc
      1. initial mark : old region의 객체가 참조하는 survivor region을 찾음(stop-the-world)
      2. root region scan : 1번에서 참조된 객체를 scan
      3. concurrent mark : 전체 region scan
      4. remark : gc대상에서 살아남을 객체 식별(stop-the-world)
      5. cleanup : 살아 있는 객체가 적은 region에 대한 미사용 객체 제거 수행(stop-the-world)
      6. copy : cleanup과정에서 비워지지 않은 region의 살아남은 객체들을 새로운 region(avilable/unused)에 복사하여 compaction 작업 수행


References

0개의 댓글