취미가 좋다

JVM의 Garbage Collector 본문

개발 기타/테크톡

JVM의 Garbage Collector

benlee73 2022. 2. 15. 15:08

JVM

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

메모리 관리, Garbage Collector 수행

 

Garbage Collector

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

 

Stack

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

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

Heap에 있는 객체의 주소를 갖는다.

 

Heap

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

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

객체가 들어간다.

 

Garbage Collector 과정

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

2. (Mark) Reachable Object 가 참조하고 있는 객체도 찾아서 마킹한다.

3. (Sweep) 마킹되지 않은 객체를 Heap 에서 제거한다.

 

Heap

New Generation Old Generation
Eden Survival 0 Survival 1 Old Generation

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

- Eden이 모두 사용됐을 때 GC 발생(Minor)

- Mark & Sweep 후 살아남은 Reachable 객체가 Survival 0 로 이동한다.

- Unreachable 객체는 메모리에서 해제된다.

 

- 위 과정을 반복한다.

- Survival 0 가 가득차면 Survival 0 내에서 GC 발생

- Survival 0 영역에서 살아남은 객체가 Survival 1 영역으로 이동

- 이동된 객체는 Age 값 증가

 

- 다시 반복할 때 Eden에서 GC 후 Reachable 객체는 영역이 채워져 있는 Survival 1 로 이동한다.

- 즉, Survival 0, 1 중 하나는 항상 비워져 있다.

- Survival 1 영역이 다 차게 되면 GC 후 Age를 증가시켜서 객체를 Survival 0로 이동시킨다.

- 이러한 과정을 반복하면서 Survival 0와 1이 번갈아 가득차게 된다.

 

- 특정 Age를 넘어서면 Old Generation 영역으로 객체가 이동한다.

- 이를 Poromotion이라고 한다.

- Old Generation 이 가득 차게 되면 GC 발생(Major)

 

Garbage Collector 종류

1. Serial GC

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

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

Mark-Compact Collection 알고리즘 사용 : Sweep 이후 파편화된 데이터를 모아주는 Compact 과정 추가

 

2. Parallel GC

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

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

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

 

3. Concurrent Mark Sweep GC (CMS GC)

Stop-The-World

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

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

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

 

Serial Gc, Parallel GC는 Stop-The-World 과정이 포함된다.

CMS GC는 Stop-The-World 시간을 줄여서 애플리케이션 응답 시간이 빠르다.

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

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

 

4. G1 GC

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

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

STW 시간을 줄이고 Compaction 단계가 포함된다.


https://youtu.be/vZRmCbl871I

 

'개발 기타 > 테크톡' 카테고리의 다른 글

Forward Proxy, Reverse Proxy, Load Balancer  (0) 2021.10.04
MySQL & Oracle & MariaDB & PostgreSQL 비교  (0) 2021.09.28
SQL 인젝션  (0) 2021.09.24
[테코톡] Process vs Thread  (0) 2021.08.25
Comments