JAVA

Garbage Collector

whyWhale 2021. 4. 25.
  • GC의 동작원리 및 언에 작동하는지

※ Stack 과 Heap 영역

  • Stack 영역: 정적으로 할당한 데이터영역.
    • 원시 타입 데이터가 값과 함께 할당, Heap 영역에 생성된 Object 타입의 데이터의 참조 값 할당하는 영역.
    • Unreachable Obejct
  • Heap 영역: 동적으로 할당한 메모리 영역 ( new )
    • 모든 Object 타입의 데이터가 할당되어 있고, Heap영역의 Object를 가르키는 참조변수가 Stack에 할당.
    • Reachable Object

 

 

 

Garbage Collector란


사용되고 있지 않은 메모리를 알아서 해제해주는 역할을 한다.

c와C++에서는 개발자가 직접 메모리를 해제한다. 하지만 자바는 GC가 대신 안쓰는 메모리를 찾아서 해제해준다.

 

 

 

Garbage Collector 장점과 단점


장점

  • 유효하지 않은 포인터 접근을 방지할 수 있다.
    • 해제된 메모리에 접근하는 버그.
  • 이중 해제를 방지 할 수 있다.
  • 메모리 누수를 방지 할 수 있다.

 

단점

  • 어떤 메모리를 해제할지 결정하는데 비용이 든다.
  • 객체가 필요 없어지는 시점은 프로그래머만 알고 GC는 모른다. 그래서 GC알고리즘이 메모리 해제 시점을 추적해야하 하는 오버헤드가 발생한다.
  • GC가 일어나는 타이밍이나 점유 시간을 예측하기 어렵다.
    • 프로그램이 예측 불가능하게 일시적으로 정지 할 수있으므로 실시간 시스템에는 적합하지 않다.
    • GC가 발생하면 GC외 다른 스레드는 모두 정지한다.(Stop the World)

 

 

 

Garbage Collector 작동 원리


  • Stack의 모든 변수를 스캔하면서 가각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
  • Reachable Obejct가 참조하고 있는 객체도 찾아서 마킹.
  • --------    여기까지 'Mark' 라는 과정  ------------------------------------------
  • 마킹 되지 않은 객체를 Heap에서 제거한다.
  • --------    여기까지 'Sweep' 이라는 과정 ---------------------------------------

요약하자면 참조 되고 있는 객체들을 마킹하고 참조되지 않은 객체들을 모두 모아 비워준다.

 

 

 

 

 

Garbage Collector 발생 시기


Heap 상세 구조

  • 새로운 객체 생성 모두 Eden 영역으로 할당된다.
  • Eden 영역이 가득차면 GC가 발생한다. 여기서의 GC는 Minor Gc이다(Sweap & mark 과정 수행)
  • Eden 영역이 가득차면
    • Survivor 0으로 이동한다.
    • Survivor 0이 가득차면 Minor GC가 등장한다.(Sweap & mark과정을 수행)
    • S1으로 이동한다.+ (age 값을 증가시켜준다 ++)
  • ※ s1이 가득차면 버리는 것인가?
    • s0으로 간다. 
    • ageing 해준다.
  • s0과 s1을 번갈아가면서 채워준다. 단 하나는 비워있어야 한다.
  • 전체적인 흐름은 새로운 객체들을 모두 Eden영역으로 들어와 꽉차면 s0,s1중 어느정도 채워진 부분에만 채워넣는다. 즉 하나는 항상 비워둔다.
  • s0 s1으로 계속적으로 aging하다가 어느정도 일정 값에 도달하면 old Generation 부분으로 이동한다.
  • 이 과정을 'Promotion'이라고 한다.
  • Old 영역도 꽉차면 GC가 발생한다.
  • GC는 Major GC이다. (Sweap & Mark 과정을 수행한다)

 

 

'JAVA' 카테고리의 다른 글

static  (0) 2021.05.04
가비지 콜렉터의 종류  (0) 2021.05.03
Reflection  (0) 2021.04.16
제네릭 타입의 컴파일 영향  (1) 2021.04.10
자바의 compile 과정  (0) 2021.04.04

댓글