Home

Jeong-Yoon

10 Jan 2020

Garbage collector(gc)

Garbage Collector(GC)

  • 참조되지 않은 객체들을 탐색 후 삭제하는 역할
  • 삭제된 객체의 메모리를 반환하며 Heap 메모리의 지속적인 재사용이 가능하도록 한다.

GC 객체의 생명 주기

  • Created (생성)
  • In use or reachable (사용 중)
  • Invisible (사용 중 but 접근 불가)
  • Unreachable (사용 되지 않음)
  • Collected (GC 대상이 됨)
  • Finalized (Finalize 를 거친 상태)
  • Deallocated (메모리 해제 된 상태)

Created(생성)

  • 먼저 객체를 위한 메모리 공간을 Heap에 할당한 다음 Super Class 의 생성자 호출을 한다.
  • Initializer 및 instance variable 의 initialize를 수행 한 후 해당 객체의 생성자를 수행한다.
    • Initializer 이란 Class 코드의 Global Area에 선언된 { }사이에 기술된 코드들을 말한다.
    • 이 Initializer들이 constructor(생성자) 보다 먼저 호출 된다.

In use or reachable (사용 중)

  • 객체가 생성되어 다른 객체에 의해 참조 되어 있는 상태이다. 이상태를 Strongly referenced 상태 라고 한다.

Invisible (사용 중 but 접근 불가)

  • Invisible 상태는 Strongly referenced는 되어 있지만, 직접적으로 접근 할 수 없는 상태이다.
  • 여기서 주의할 점은 Invisible 객체가 항상 바로 GC대상이 되지 않는 다는 것이다.

Unreachable (사용 되지 않음)

  • strong reference가 존재 하지 않을 경우이며 Unreachable 상태의 객체는 GC의 후보가 된다.
  • 여기서 후보가 된다는 것은 바로 GC가 된다는 게 아니라, GC대상 큐에만 들어간다는 개념이다.
  • 이러한 객체들은 GC의 루트가 가지는 체인에 참조되는 형태이며, GC가 수행될 때 이 루트의 체인을 따라가며 메모리 해제를 한다.

Collected (GC 대상이 됨)

  • 메모리 해제 단계의 도입부이다.
  • 이 상태에서는 GC가 해당 객체의 finalize() function이 정의되어 있는지 판단을 한다.
  • finalize가 있다면 finalizer라는 queue에 넣고, 없다면 바로 다음 단계인 Finalized 상태로 전환 시킨다.

Finalized (Finalize 를 거친 상태)

  • Finalizer에 의해 finalize가 실행된 후의 상태
  • finalize는 Collected 상태라고 바로 수행되는 것이 아니라, Finalizer의 Queue에 들어가는 것이기 때문에 해당 객체의 finalize가 불러지는 타이밍은 보장되지 않는다. JVM에 따라서 수행 시간도 다르다.
  • GC를 수행함에 있어 객체에 finalize가 구현되어 있다면 객체의 반환시간은 그만큼 더 늦어진다. finalize를 위한 객체의 메모리도 그만큼 증가한다.
    • finalize는 한 객체에 대해 한번만 실행된다.

Deallocated (메모리 해제 된 상태)

  • 메모리의 반환이 끝난 상태로, GC의 동작이 마무리 된다.



Minor Garbage Collection

  • New 영역에서 일어나는 Garbage Collection
  • Eden 영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection이 발생한다.
  • Survivor1 영역에 값이 복사되고, Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제한다.
  • Eden 영역과 Survivor1 영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된 객체와 Survivor1 영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사한다.
  • 참조되고 있는 객체를 Survivor2 영역에 복사한다.
  • Survivor2 영역을 제외한 영역의 객체들을 삭제하고 일정시간 이상 참조되고 있는 객체들은 Old 영역으로 이동한다.

Major Garbage Collection

  • Old영역에 있는 모든 객체들을 검사한다.
  • 참조되지 않은 객체들을 한꺼번에 삭제한다.
  • Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지된다.

Til next time,
Jeong-Yoon at 00:00

scribble