개발하슈

[java] Garbage Collector 본문

java

[java] Garbage Collector

하슈타인 2021. 12. 10. 04:04
  • JVM(Java Virtual Machine) : 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램

      - 메모리 관리, Garbage Collector 수행

 

  • Garbage Collector : 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능

      - 동적으로 할당한 메모리 -> Heap

  • Stack : 정적으로 할당한 메모리 영역

      - 원시 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object 타입의 데이터의 참조 값 할당

  • Heap : 동적으로 할당한 메모리 영역

      - 모든 Object 타입의 데이터가 할당, Heap영역의 Object를 가리키는 참조 변수가 Stack에 할당

 

  • Garbage Collector 과정
  1. Garbage collector 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다 (Mark)
  2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다 (Mark)
  3. 마킹되지 않은 객체를 Heap에서 제거한다 (Sweep)

      -> 참조되는 객체를 찾아서 마킹하고 그 외에 것을 삭제한다 (Mark and Sweep이라고 한다)

 

  • Garbage Collection은 언제 일어날까?
  •  
  • Heap에서 새로운 객체는 Eden 영역에 할당된다
  • Eden 영역의 메모리가 다 사용되면 이 때 GC 발생한다 (Minor GC 라고 함)
  • Eden 영역객체가 다 할당되면 Survival0영역으로 이동한다
  • Eden 영역의 Unreachable 객체는 메모리에서 해제된다
  • 이 과정이 계속 반복한다
  • Survival0영역이 다 차면 여기서 또 GC 발생
  • 여기서 살아남은 객체를 Survival1 로 이동한다
  • Survival0 영역과 Survival1 영역의 둘중 하나는 비어있어야한다(0->1 ,1->0)
  • 이동할 때마다 객체의 age 가 증가한다
  • 이 과정을 반복하다가 객체의 age가 age threshold 에 도달하면 살아남아 있는 객체는 Old generation영역으로 이동한다 (Promoted)
  • Old generation영역이 가득 차면 GC를 실행한다 (Major GC 라고한다)
  • 이 과정이 반복되면서 Gabage Collector가 메모리를 관리한다