[Garbage Collector] GC란 무엇인가?

728x90
반응형
SMALL

출처 : https://www.perfmatrix.com/

Garbage Collector

정리되지 않은 메모리, 유효하지 않은 메모리 주소, 주소를 잃어버려 사용할 수 없는 메모리 등의 가비지를 메모리에서 해제시켜 다른 용도로 사용할 수 있게 해주는 프로그램

 

 

Stop The World

GC 실행을 위해 JVM이 애플리케이션 실행을 멈추는 것이다.

 

즉, GC를 실행하는 스레드를 제외한 모든 스레드들이 작업을 멈춘다. (GC 튜닝은 이 STW 시간을 줄이는 것)

 

 

과정

Java는 프로그램 코드에서 메모리를 명시적으로 지정하여 해제하지 않는다. (명시적 해제를 위해 System.gc() 사용 금지)

 

즉, 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 GC가 필요 없는 객체를 찾아 지우는 역할을 한다.

 

Young Generation (Monir GC)

새롭게 생성한 객체가 존재한다. Eden 영역 + Survior 영역 2개

 

  • 생성된 객체는 Eden 영역에 위치 한다.
  • Eden 영역에서 GC 발생 후 살아남은 객체는 Survivor 영역 중 하나로 이동, 계속 Survivor 영역에 객체가 계속 쌓인다.
  • 하나의 Survivor 영역이 가득 차게 되면 GC 발생, 또 살아남은 객체를 다른 Survivor 영역으로 이동한다.
  • 가득 찬 Survivor 영역은 빈 상태가 된다.
  • 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동한다.

Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다.

두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 해당 시스템은 비정상 상태이다.

 

Old Generation (Major GC, Full GC)

접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 존재한다.

 

 

Serial GC

Young 영역은 기본 GC와 동일한 방식을 사용한다. Old 영역의 GC는 mark-sweep-compact 알고리즘을 사용한다.

 

Serial GC는 적은 메모리와 CPU 하나만 있을 때 적합하다.

 

  • Old 영역에 살아 있는 객체를 식별(Mark) 한다.
  • Heap의 앞부분부터 확인하여 살아 있는 것만 남긴다.(Sweep)
  • 각 객체들이 연속되게 쌓이도록 Heap의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눈다.(Compact)

 

Parallel GC (Throughput GC)

Serial GC와 기본적인 알고리즘은 같지만, GC를 처리하는 스레드가 여러 개다. (Serial GC는 스레드 하나)

 

메모리가 충분하고 코어의 개수가 많을 때 유리하다.

 

 

CMS GC

stw가 짧지만, 메모리와 CPU를 많이 사용한다.

 

또한, 조각난 메모리가 많아 Compaction 작업을 실행하면 다른 GC의 stw 시간보다 stw 시간이 길어진다.

 

출처 : https://www.perfmatrix.com/

 

  • Inital Mark
    • 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만 찾는다.
    • 따라서, stop-the-world 시간이 짧다.

 

  • Current Mark
    • 살아 있는 객체에서 참조하고 있는 객체들을 따라가면서 확인한다.
    • 다른 스레드가 실행 중인 상태에서 동시에 진행된다.

 

  • Remark
    • Current Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인하다.

 

  • Concurrent Sweep
    • 쓰레기를 정리한다.
    • 다른 스레드가 실행 중인 상태에서 진행된다.
728x90
반응형
LIST

'Develope > Java' 카테고리의 다른 글

[Java] JVM 이란 무엇인가?  (0) 2022.08.12