GC (Garbage Collection)
- 프로그램이 동적으로 할당했던 메모리 영역 중 필요 없기 된 영역을 알아서 해제해주는 기능
- 동적으로 할당했던 메모리 →
Heap
- 필요 없게 된 영역 →
어떤 변수도 가리키지 않음
- 동적으로 할당했던 메모리 →
장점
- 메모리 누수 해결
- 해제된 메모리 접근
- 해제한 메모리 중복 해제
단점
- GC 작업은 순수 오버헤드
- 개발자가 언제 GC를 실행하는지 알기 어려움
GC 알고리즘
1. Reference Counting
- Root Space 에서 Heap 영역에 선언된 객체들이 별도의 Count를 가지고 있음
- 이때 Count는 해당 객체에 접근할 수 있는 방법의 개수를 뜻함
- reference count 가 0이라면 GC 대상이 됨
순환 참조
시 GC 대상에 포함되지 않는다는 단점이 있음
2. Mark And Sweep
- Root에서부터 그래프 순회를 통해 참조되고있는 객체를 Mark (Reachable)
- 참조되고 있지 않은 객체 (Unreachable) 들을 Sweep 함
- Compaction → 메모리 파편화를 막는 작업 (옵션)
특징
- 의도적으로 GC를 실행시켜야함
- 애플리케이션 실행과 GC 실행이 병형된다.
JVM 구조
- Class Loader
- 바이트코드를 읽고 클래스 정보를 Runtime Data Area (Heap/Method Area)에 저장
- Memory
- 실행중인 프로그램의 정보가 들어있음
- Execution Engine
- Runtime Data Area에 있는 바이트코드를 Native code로 변환시켜주고 GC를 실행하는 실행 엔진
- 쓰레드가 공유하는 영역
Method Area
- 프로그램의 클래스 구조를 메타데이터처럼 가지며 메서드 코드를 저장
Heap
- 객체 인스턴스를 저장하는 영역
- 쓰레드별로 생성되는 영역
PC register
- 스레드가 현재 실행할 스택 프레임의 주소
Stack
- 로컬 변수, 중간 연산 결과 등
Native Method Stack
- C, C++ 등 Low Level 코드를 저장
Root Space
Root Space
- Stack의 로컬 변수
- Method Area의 static 변수
- Native Method Stack의 JNI 참조
- Minor GC
- young generation 영역에서 일어나는 GC
eden → Survivor 0 → Survivor 1 → Survivor 0 → … → Old generation
- Young generation 영역에서 Reachable이라고 판단되어 생존한 객체들은 age 값이 증가함
- 특정 Age bit 이상이 되면 Old Generation 영역으로 옮겨짐
- Major GC
- old generation 영역에서 일어나는 GC
- Minor GC 보다 발생 횟수가 적지만 비용이 큰 GC
GC 종류
Stop the world
- GC를 실행하기 위해 JVM이 동작을 멈추는 것
Serial GC
- 싱글 스레드 환경 및 Heap 영역이 매우 작을 때 사용
Paraller GC
- 멀티코어 환경에서 애플리케이션 처리 속도 향상을 위해 사용
G1GC
- Heap 영역을 Region으로 사용하는데, 런타임에 G1GC가 필요에 따라 영역별 Region 개수를 튜닝함
- Stop the world 시간 최소화
ZGC
- Java 15에서 정식으로 적용됨, Java 17에서도 반영됨
- Heap 영역을
ZPage
라는 논리적인 단위로 구분한다. - Bit 값을 기반으로 애플리케이션 실행 스레드와 동시에 GC를 실행하여 STW 시간을 줄인 방식
- 어떠한 Heap 메모리 사이즈에서도 STW 시간을 10ms 이하로 줄이는 것을 목표로함
'TIL' 카테고리의 다른 글
[TIL] @Transactional (0) | 2025.01.13 |
---|---|
[TIL] HTTP 버전별 특징 (0) | 2024.12.30 |
[TIL] SQL Injection (0) | 2024.12.16 |
[TIL] AWS 인프라 및 서비스 개요 (1) | 2024.12.09 |
[TIL] DB 트랜잭션 (0) | 2024.12.02 |