[테코톡] JVM의 Garbage Collector (GC)

코즈의 Garbage JVM의 Collector

영상 링크: https://youtu.be/vZRmCbl871I 테코톡 스터디: https://github.com/chance0523/Techo-Talk-Study

1. 시작하면서…

  • 면접 단골 질문 Garbage Collector! 리마인드 할겸 시청하기로 했다.

2. Garbage Collector

  • 동적으로 할당된 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능
  • Stack, Heap
    • Stack: 정적으로 할당된 메모리 영역. Primitive 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object 타입 데이터의 참조 값 할당 가능
    • Heap: 동적으로 할당된 메모리 영역. 모든 Object 타입의 데이터가 일단 할당. Heap 영역의 Object를 가리키는 참조 변수가 Stack에 할당
  • Garbage Collector 과정
    • Garbage collector가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다. -> Mark
    • Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다. -> Mark
    • 마킹되지 않은 객체를 Heap에서 제거한다. -> Sweep
    • -> Mark And Sweep

      3. New/Old Generation

  • New Generation
    • Eden
      • 새로운 객체는 Eden 영역에 할당
      • Eden이 차면 Minor GC가 발생.
    • Survival 0
      • Eden에서 살아남은 객체는 Survival 0으로 옮겨진다.
      • Survival 0가 차면 Minor GC가 발생. 살아남은 객체는 Survival 1로 이동. 이동한 객체는 Age가 증가.
    • Survival 1
      • Eden 영역의 Reachable 객체는 Survival 1으로 옮겨진다. Eden 영역의 Unreachable 객체는 메모리에서 해제 (Minor GC) -> Survival 0 또는 1 중 객체가 차 있는 곳으로 이동한다.
      • Survival 1이 차면 Minor GC가 발생. 살아남은 객체는 Survival 0으로 이동. 이동한 객체는 Age가 증가.
  • Old Generation
    • Age 값이 특정 값 이상이 되면 Old Generation 영역으로 옮겨진다. 이 과정을 Promotion이라고 한다.
    • Old Generation이 가득 차면 GC가 발생하게 된다. 이 때 발생하는 GC는 Major GC라고 한다.
  • 위의 과정이 반복되면서 GC가 메모리를 관리한다.

4. GC의 종류

  • Serial GC
    • GC를 처리하는 스레드가 1개이다.
    • CPU 코어가 1개만 있을 때 사용하는 방식
    • Mark-Compact Collection 알고리즘 사용 (Mark -> Sweep -> Compact)
  • Parallel GC
    • GC를 처리하는 스레드가 여러개이다.
    • Serial GC보다 빠르게 객체를 처리할 수 있다.
    • Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.
  • Concurrent Mark Sweep GC (CMS GC)
    • Stop-The-World
      • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
      • stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모든 작업을 멈춘다.
      • GC 작업을 완료한 이후에 중단한 작업을 다시 시작한다.
    • stop-the-world 시간이 짧다.
    • 애플리케이션의 응답 시간이 빨라야할 때 CMS GC를 사용한다.
    • 다른 GC 방식보다 메모리와 CPU를 더 많이 사용한다.
    • Compaction 단계가 제공되지 않는다.
  • G1 GC
    • 각 영역을 Region 영역으로 나눈다.
    • GC가 일어날 때, 전체영역(Eden, Survial, Old Generation)을 탐색하지 않는다.
    • G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 빈 영역에 객체를 할당하고 GC를 실행한다.
    • G1 GC는 STW 시간이 짧다.
    • Compaction을 사용한다.
추가로 볼 것