GC의 종류와 알고리즘

최창효·2022년 2월 17일
0

자바 이해하기

목록 보기
3/8
post-thumbnail

들어가기 앞서

GC가 뭔지 모르신다면 여기를 먼저 읽어주세요.

이번 포스팅은 여기의 마지막 부분에 기술한 GC의 종류에 대한 상세한 설명입니다.

Serial GC

  • GC를 처리하는 쓰레드가 하나인 Single Thread 입니다.

  • 여러 쓰레드(파란색 화살표)가 존재하지만 GC를 수행하는 쓰레드는 하나밖에 없습니다.

  • 앞에서 설명한 Mark and Sweep(Mark Compact Algorithm)방법으로 GC가 진행됩니다.

Parallel GC

  • Serial GC와 유사합니다. 차이점은 Single Thread가 아닌 Multi Thread라는 점입니다.

  • 여러 쓰레드에서 GC를 실행합니다.

  • 병렬적인 처리 덕분에 Serial GC보다 처리 속도가 빠릅니다.

  • 자바8의 기본 GC입니다.

CMS GC

  • CMS는 Concurrent(공존하는, 동시에 발생하는) Mark Sweep의 줄임말입니다.
  • 절차
    • Initial Mark단계 - 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만을 찾고 종료됩니다.
    • Concurrent Mark단계 - Initial Mark단계에서 살아있다고 확인한 객체에서 참조하고 있는 객체를 따라가면서 참조 여부를 확인합니다.
      • 다른 쓰레드가 실행 중인 상태에서 이러한 과정이 진행됩니다.
    • Remark단계 - Concurrent Mark단계에서 새로 추가되거나 참조가 끊긴 객체를 확인합니다.
    • Concurrent Sweep단계 - Sweep, 쓰레기를 버리는 작업이 진행됩니다.
      • 다른쓰 레드가 실행 중인 상태에서 이러한 과정이 진행됩니다.
  • Compaction을 기본적으로 제공하고 있지 않아 단편화 현상이 발생할 수 있습니다.

  • Initial Mark단계와 Remark단계에서만 Stop the World가 발생합니다.

    • CMS GC는 Stop the World를 줄이는 것에 초점을 둔 방법이기 때문에 Stop the World 시간이 아주 짧습니다.
    • 메모리와 CPU를 다른 GC보다 많이 사용한다는 단점이 있습니다.
  • 모든 애플리케이션의 응답 속도가 매우 중요할 때 주로 사용합니다.

  • Low Latency(지연시간이 적은) GC라고도 불립니다.

G1 GC

  • G1은 Garbage First의 약자입니다.
    • Heap에 전역적으로 Marking 하고, 가장 많은 공간이 있는 곳부터 메모리 회수를 진행하기 때문에 Garbage First라는 이름이 붙었습니다.
  • 다른 GC들과 다르게 Young Generation과 Old Generation으로 공간을 구분하지 않습니다.
    • 대신 Heap영역을 Region이라는 grid로 나눴습니다.
    • Region은 그 상태에 따라 역할(Eden,Survivor,Old,Humonogous,Available/Unused)이 동적으로 변합니다.
      • Humonogous - Region 크기의 50%를 초과하는 큰 객체를 저장하기 위한 공간입니다.
      • Available/Unused - 아직 사용되지 않은 공간입니다.

  • 절차는 다음과 같습니다.
    • Initial Mark - Root Region Scan - Concurrent Mark - Remark - Clean up - Copy
    • G1 GC도 다른 GC들과 마찬가지로 각 영역이 다 차면 GC가 실행되며 살아남은 객체들은 Survival로 옮겨지는 과정으로 GC가 진행됩니다.
  • 대용량 메모리에 적합한 GC입니다.
  • 자바9의 기본 GC입니다.

Z GC

  • G1 GC와 유사한 형태입니다.
  • Colored pointers 와 Load barriers 알고리즘이 존재합니다.
  • 자바11부터 사용 가능합니다.
  • 64bit에서만 사용이 가능합니다.

References

profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글