본문 바로가기

개발자노트/우아한 테코톡 감상

우아한Tech [10분 테코톡] JVM의 Garbage Collector

JVM(Java Virtual Machine)

- 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램

- 역할 : 메모리 관리, Garbage Collector를 수행

 

Garbage Collector

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

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

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

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

              모든 Object 타입의 데이터가 할당. Heap영역의 Object를 가르키는 참조 변수가 Stcak에 할당.

- 메인 매서드가 끝나게 되면 Stack 영역에 있는 데이터가 날라가고, Heap 영역에 객체타입의 데이터만 남는데 이러한 객체를 Unreachable Object라 하고, 이것들이 Garbage Collector 의 대상이 됨

 

Garbage Collector 과정

1.Garbage Collector 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를  참조하고 있는지 찾아서 마킹한다.

 

2.Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.             => 이러한 과정을 객체를 찾아서 마킹하는 과정이라서  Mark

 

3. 마킹되지 않은 객체를 Heap에서 제거한다.  => 이러한 과정을 쓸어내린다고 해서 Sweep

 

여기서 '던' 이라는 개체가  Un Reachable   Object 이고, 이런 영역이 Garbage Collector를 통해서 해제되게 된다.

 

Garbage Collection은 언제 일어날까?

-Heap의 구조

- 새로운 객체는 Eden 영역에 할당된다.

- Eden 영역이 꽉차게 되면 GC 발생(Minor)

- Eden 영억의 Reachable 객체는 Survival0 으로 옮겨진다.

  Eden 영역의 Unreachable 객체는 메모리에서 해제

- Survival 0의 영역에서 살아남은 객체들은 Survival1 영역으로 이동되는데, 이동한 객체는 Age 값 증가

- 결정적으로 Survival0, Survival1 영역은 둘중 하나는 항상 비워진 상태로 유지가 된다.

-  Survival1 영역이 또 꽉 차게 되면 GC가 발생해서 Survival0 영역으로 이동, 이동한 객체는 Age 값 증가

-  Age 값이 계속 증가하다가, 특정 값 이상이 되면 Old Generation 영역으로 옮겨진다. 이 과정을 Promotion 이라고 한다.

- Old Generation 영역이 꽉차게 되면 또 GC가 발생하는데 이 때 발생한 GC를 Major GC라고 함

 

지금까지의 과정이 반복되면서 Garbage Collection가 메모리를 관리한다.

 

 

 

Garbage Collection 종류

1. Serial GC

- GC를 처리하는 스레드가 1개이다.

- CPU 코어가 1개만 있을 때 사용하는 방식

- Mark-Compact Collection 알고리즘

 

2. Parallel GC

- GC를 처리하는 스레드가 여러 개 이다.

- Serial GC보다 빠르게 객체를 처리할 수 있다.

- Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.

 

 

3. Concurrent Mark Sweep GC

- Stop-The-World 시간이 짧다.

- 애플리케이션의 응답 시간이 빨라야 할 때 CMS GC를 사용한다.

- 다른 GC방식보다 메모리와 CPU를 더 많이 사용한다.

- Compaction 압축되는 단계가 제공되지 않는다.

 

))Stop-The-World

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

- stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.

- GC 작업을 완료한 이후에 중단한 작업을 다시 시작한다. 

Stop-The-World를 줄이기 위한 Concurrent Mark Sweep GC

- Initial Mark 과정에서 GC과정 중 1번째 과정을 수행한다.

- Concurrent Mark 과정에서 다른 애플리케이션 스레드와 동시에 수행되면서 이니셜 마크에서 마킹을 해뒀던 객체를 어떠한 객체를 참조하고 있는지 객체그래프를 타고 가면서 계속해서 마킹하는 과정

- Remark 과정에서 살릴건 살리고 죽일건 죽이는 과정

- Cocurrent Sweep에서 다른 애플리케이션 스레드와 동시에 수행되면서 데이터드를 해제하는것

 

4. G1 GC

- 각 영역을 Region 영역으로 나눈다.

- GC가 일어날 때, 전체 영역(Eden, Survival,Old generation) 을 탐색하지 않는다.

G1

- G1.GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다.

  그러다가 해당 영역이 꽉 차면 다른 빈 영역에 객체를 할당하고 GC를 실행한다.

- G1.GC는 STW 시간이 짧다.

- Compaction을 사용한다.

 

자료: https://www.youtube.com/watch?v=vZRmCbl871I