GC (Garbage Collection)
=> 자바 프로그램에서 동적 할당된 객체들 중에서 사용되지 않는 객체들을 자동으로
탐지하여 해제하는 프로세스
=> 메모리 누수와 같은 일반적인 메모리 관리 문제를 해결하기 위해 사용
=> Heap Memory 에서 사용되지 않는 객체를 식별하고 회수하여 메모리를 재사용 할 수 있음
Heap Memory 란?
=> 자바에서 동적으로 생성된 객체들이 저장되는 메모리 영역
=> JVM 메모리 구조 중 하나
=> 프로그램 실행 중 필요한 객체들이 할당되고 관리
=> 크기가 유동적이며, GC 대상임
GC 알고리즘 : 사용되지 않는 객체를 식별하고 해제하는 방법 / App의 요구사항과 환경에 맞는 알고리즘 선택
GC 구성요소
New 영역
1. 객체 동적 할당 : new 영역으로 새로 생성된 객체가 할당됨
2. Eden 영역 과 Survivor 영역으로 나뉨
3. 객체가 처음 생성 되면 Eden 영역으로, 나머지 객체는 Survivor 영역으로 이동함
4. New 영역 내 Garbage 객체들을 처리하는 Minor GC 가 주기적으로 실행됨
5. Minor GC 가 실행되고 참조되지 않는 객체는 제거하고 살아남은 객체를 Survivor 영역으로 이동하며
Eden과 Survivor1 영역의 메모리를 Survivor2 영역으로 이동시킴
(이때 사용 되지 않는 메모리는 Eden과 Survivor1 영역에 남아있게 되고 클리어 됨)
6. Survivor2 영역에서 오래된 데이터를 Old 영역으로 옮김
=> 이러한 방식을 Copy&Scavenge 라고 함
=> Minor GC는 자주 일어나기 때문에 걸리는 시간이 짧은 알고리즘이 적절하다.
Old 영역
1. new 영역에서 오래된 객체들이 Old 영역으로 이동됨
2. Old 영역의 GC를 Full GC라고 함
3. 전체 객체를 참조하며 연결되지 않은 객체를 표시함
4. 표시된 객체를 제거한다
=> Full GC는 속도가 매우 느리며 Full GC가 일어나는 도중 순간적으로 STW(Stop the world) 가 생겨 안정성에 큰 영향을 줌
GC의 방식으로는 Serial GC, Parallel GC, Concurrent Mark-Sweep GC, G1GC 등이 있는데
CMS와 G1GC 등 GC의 종류에 대해 알아보겠음
Serial GC
=> 단일 스레드에서 GC를 수행함
=> STW가 발생함, 작은 힙 크기에서 사용하기 적합하다
=> 클래식한 알고리즘
Parallel GC
=> 여러 스레드를 사용하여 병렬로 처리
=> 어플리케이션 실행을 일시 중단하고 GC 작업 동안 여러개의 스레드가 협력하여 가비지 수집
=> 다중 코어 시스템에서 향상된 처리량 제공
CMS GC (Concurrent Mark Sweep GC)
=>Stop the world를 줄이고자 만든 GC
=> 응답시간을 중요시 하는 App에 적합함
=> 한 객체를 한번에 찾지 않고 여러번 나눠서 찾는 방식 (4 Step)
1. GC Root 가 참조하는 객체 마킹 (STW 발생)
2. 참조 객체 지속적 마킹 (STW 없음)
3. 마킹된 객체 재확인 및 확정 (STW 발생)
4. 마킹 객체 제거 (STW 없음)
G1GC (Garbage First GC)
=> 전체 힙 공간을 리전(Region)으로 분할하여 가비지 컬렉션을 수행하는 알고리즘
=> 대규모 메모리에서도 안정적인 성능 제공
=> Java 9 의 default GC
=> STW 시간이 가장 짧음
ZGC
=> 대용량 heap을 위해 설계된 low-latency GC
=> STW 시간을 10ms 이하를 목표로 함
=> Heap 크기가 증가하더라도 정지 시간이 증가하지 않음
=> 힙크기를 동적으로 확장하고 축소하는기능을 제공함
ZGC 참고
https://sarc.io/index.php/java/2098-zgc-z-garbage-collectors
'WEB WAS > 미들웨어' 카테고리의 다른 글
MPM (Multi-Processing Module) 이란? (1) | 2023.06.04 |
---|---|
GSLB 란? (Global Server Load Balancing) (0) | 2023.06.04 |
L4 부하 분산 - 로드밸런싱 방법 (해시, R.R, LC) (0) | 2023.06.04 |
JDBC 란? (0) | 2023.06.04 |
아파치, 톰캣 연결법 (3가지) (0) | 2023.06.04 |