감상문

GC(Java)

ihl 2021. 10. 11. 20:55

 


  • GC : Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스
    • Heap: Object 타입의 객체들
  • Heap의 구조
    • Young Generation : 새로운 객체들이 할당되는 영역
      • Eden
      • Suvivor 0, 1
        • Survivor 0, 1 둘 중 하나의 영역은 비어있어야 한다.
    • Old Generagtion : 오랫동안 수거되지 않고 살아남은 객체들이 존재하는 영영
  • meta space : GC 시에 필요한 클래스와 메서드의 요약정보가 있는 영역
  • GC의 수거대상 판별
    • GC의 루트로부터 참조하고 있는 객체들을 하나씩 탐색해나간다.
      • GC의 Root : Stack 영역 데이터, Method 영역의 Static 데이터, JNI에 의해 생성된 객체
    • 어떤 객체에 유효한 참조가 존재한다면 Reachable, 그렇지 않다면 Unreachable이라 한다.
    • Unreachable한 객체는 GC가 수거한다.
  • GC의 알고리즘
    • Mark
      • GC Root로부터 모든 변수를 스캔하면서 수거 대상을 찾아 마킹한다.
    • Sweep
      • GC의 수거 대상들을 Heap에서 제거
    • Compact
      • Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리 단편화를 막는다.
  • GC 동작의 전제 조건
    • 대부분의 객체는 금방 UnReachable한 상태가 된다.
      • -> Minor GC는 많은 Garbage를 수거하므로 자주 일어나도 괜찮다.
      • -> Major GC는 상대적으로 Garbage를 수거하므로 적게 발생시켜야 한다.
    • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
  • GC의 동작
    • 새로운 객체가 Young Generation의 Eden에 할당된다.
      • Eden에 더이상 할당할 공간이 없다면 Minor GC 발생
        • Reachable / Unreachable 판별
        • Reachable 객체는 Survivor 0영역으로 이동 후 age 값을 증가시킨다.
        • Unreachable 객체는 제거된다.
    • 새로운 객체가 Young Generation의 Eden에 할당된다. 반복
      • Eden에 더이상 할당할 공간이 없다면 Minor GC 발생
        • Reachable / Unreachable 판별
        • Reachable 객체는 Survivor 1영역으로 이동 후 age 값을 증가시킨다.
        • Unreachable 객체는 제거된다.
    • age가 특정 임계점에 도달한 객체들은 Old Generation으로 이동한다.
      • Old Generation이 꽉 차면 Major GC 발생
  • Stop the World : GC를 실행하기 위해 애플리케이션 실행을 멈추는 것
    • GC 외의 모든 작업을 중단한다.