티스토리 뷰

JAVA/JAVA기본

JAVA - Garbage Collection이란?

realizers 2021. 11. 28. 15:11
728x90
반응형

Garbage Collection이란?

Garbage Collector(GC)는 Heap 메모리에서 활동하며, JVM에서 GC의 스케줄링을 담당하여 개발자가 직접 관여하지 않아도 더이상 사용하지 않는 메모리를 제거해주는 역할을 담당합니다.

Person person = new Person();
person.setName("KDG");
person.setCity("seoul");
person = null;

// 가비지 발생
person = new Person();
person.setName("홍길동");
person.setCity("seoul");

 

GC는 간단하게 말하자면 Heap Area에서 더이상 사용하지 않는 메모리를 제거하는 것을 말합니다.

전통적인 Heap Area는 위의 사진에서 볼 수 있듯이 Eden, Survivor1, Survivor2, Old Generation으로 구분됩니다.

또한  Eden, Survivor1, Survivor2를 묶어서 Young Generation이라고도 부릅니다.

 

과정 예시

  • Step 01 - 맨 처음 객체가 생성되면 Eden 영역에 생성이 됩니다. (Name이 KDG인 Person 객체 생성)
  • Step 02 - GC의 일종인 Minor GC가 발생하면 미사용 객체의 제거와 함께 아직 사용되는 것으로 판단되는 객체들을 Survivor1 또는 Survivor2 영역으로 이동시킵니다.
    • * 여기서 Survivor 영역을 거치지 않고 바로 Old Generation 영역으로 이동하는 경우가 있는데 이 경우는 객체의 크기가 Survivor 영역의 크기보다 클 경우입니다.
  • Step 03 - 아직 사용되는 것으로 판단되는 객체들은 Survivor1 또는 Survivor2 영역의 둘중 한 곳으로 넘어오게 됩니다. 이때 객체는 두 곳 모두에 존재할 수 없으며 다른 한 곳은 비워있어야 합니다.
  • Step 04 - 위의 과정(1 ~ 3)을 반복하면서 Survivor 영역에서 계속 살아남는 객체들에게 일정 score가 누적되는데, 기준치를 넘어가게 되면 Old Generation 영역으로 이동하게 됩니다.
  • Step 05 - Old Generation 영역에서 살아남았던 객체들이 일정 수준 이상 쌓이게 되면 미사용 된다고 식별된 객체들을 제거해주는 Full GC가 발생하게 됩니다.
    • 이 과정에서 STW(Stop-The-World)가 발생하게 됩니다.
    • STW란, Old Generation 영역에 쌓인 많은 객체들을 효율적으로 제거해주기 위해 JVM이 잠시 멈추는 현상을 뜻합니다.

Garbage Collection의 종류

  • Serial GC
  • Parallel GC
  • Concurrent Mark-Sweep(CMS) GC
  • G1(Garbage First) GC

Serial GC

  • 하나의 CPU로 Young 영영과 Old 영역을 연속적으로 처리하는 방식입니다.
  • 가장 단순한 방식의 GC로 싱글 스레드(스레드 1개)로 작동합니다.
  • 싱글 스레드로 동작하여 느리고, 그만큼 STW 시간이 다른 GC에 비해 깁니다.
  • Mark & Sweep & Compact 알고리즘을 사용합니다.

Parallel GC

  • Java 8의 Default GC
  • Young 영역의 GC를 멀티 스레드 방식을 사용하기 때문에 Serial GC에 비해 상대적으로 STW가 짧습니다.

Concurrent Mark Sweep GC(CMS GC)

  • STW로 Application이 멈추는 현상을 줄이고자 만든 GC
  • Reacable 한 객체를 한번에 찾지 않고 나눠서 찾는 방식을 사용합니다. (4 STEP으로 나누어짐)
  • Initial Mark 단계 
    • Class Loader에서 가장 가까운 객체 중 살아 있는 객체만 찾는 것으로 끝납니다.
    • STW가 발생하긴 하나 매우 짧습니다.
  • Concurrent Mark 단계 
    • 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인합니다.
    • 이 단계의 특징은 다른 스레드가 실행 중인 상태에서 동시에 진행합니다.
  • Remark 단계
    • Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체가 있는지 한번더 마킹하여 확인하는 과정입니다.
    • STW 발생
  • Concurrent Sweep 단계
    • 쓰레기를 정리하는 작업을 실행합니다. 해당 작업도 다른 스레드가 실행되고 있는 상황에서 진행합니다.

위와 같이 진행하므로 Stop-The-World가 최대한 덜 발생하도록 하여 Java Application이 멈추는 현상을 줄입니다.

 

단점은?

  • 다른 GC 방식보다 메모리와 CPU를 더 많이 먹는다.

Garbage First GC (G1 GC)

  • Java 9 이상의 Default GC
  • 현재 GC중 Stop-The-World의 시간이 제일 짧음
  • CMS GC를 개선하여 만든 GC로 지금까지의 GC와는 다른 구조를 가집니다.
  • Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리합니다.
  • 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하며 각각의 Region에만 GC가 발생합니다.

 

728x90
반응형