자바 가비지 컬렉션(GC, Garbage Collection)
- 힙 영역에 저장된 더 이상 사용하지 않는 객체들을 메모리에서 제거함을써, 메모리를 효율적으로 관리해주는 기능
- full GC가 일어나면 가비지 컬렉션을 수행하는 스레드를 제외한 나머지 스레드가 동작을 멈춤
- 따라서 WAS의 컨테이너에서 서비스 처리가 진행되지 않고, GC를 많이 할수록 WAS의 응답 시간에 많응 영향
- 애플리케이션의 성능을 생각한다면 GC가 어떻게 처리되고 어떤 방식을 사용하는지에 대한 이해 필요
1) GC 원리
- 가비지 컬렌션의 기본적인 원리는 Mark-Sweap 알고리즘 사용
- 현재 참조하고 있는 객체(reachable)를 mark하고, mark되지 않은 객체(unreachable)를 sweap
2) 힙 영역 구조
- GC의 종류를 알기위해선 먼저 힙 영역의 구조를 알아야 함
- 힙 영역은 객체가 오래됨에 따라 메모리 영역을 크게 세가지로 나누어 관리
a. Young(new) Generation
비교적 젊은 reference가 있는 영역
b. Old Generation
MaxTenuring Threshold 이상 살아남은 reference가 있는 영역
c. Permanent Generation
메타 정보가 저장되는 영역
3) GC 종류
(1) Minor GC
- Young Generation의 GC
a. 처음 생성된 객체는 Eden 영역에 위치
b. minor GC가 발생하면 사용되지 않는 개체는 제거되고, 살아남은 객체만 Survivor1 또는 Survivor2 영역으로 이동
c. 이후 minor GC가 발생할 때마다, 살아남은 객체는 Survivor1에서 Survivor2로 Survovir2에서 Survivor1으로 이동을 반복
d. minor GC가 반복됨에 따라오래 살아남은 객체(age bit가 MaxTenuring Threshold 이상 인)들은 Old Generation으로 이동(Young Generation 영역이 가득 찼을 경우에도 이동)
(2) Major GC(Full GC)
- Mark-Sweap-Compact
- Sweap과정에서 발생한 Scattered Holes를 모우기 위해 재구성 과정(Compact)을 거침
- Compact 과정에서 GC를 수행하는 스레드를 제외한 나머지 스레드가 정지(STW, Stop the world)
- full GC가 자주 일어나거나 수행시간이 길 경우 WAS의 응답시간에 영향
- GC 튜닝을 통해 full GC의 횟수 또는 수행 시간 조절 가능
4) GC 튜닝
- GC의 실행시간과 실행 횟수를 줄여 WAS의 응답시간을 향상
- GC 튜닝 이전에 객체 생성을 줄이거나, mutable한 클래스를 사용 등의 작업이 먼저 진행해볼 것
(1) Young 영역의 크기 조절
- Young 영역의 크기를 조절함으로써 Old 영역으로 넘어가는 객체 수를 줄임
- Full GC가 발생하는 빈도를 줄일 수 있음
(2) Old 영역의 크기 조절
- Old 영역의 크기를 조절해 Full GC의 시간 조절 가능
- Old 영역의 크기를 줄이면 Full GC의 수행시간을 줄어들지만, Full GC가 자주일어나거나 OutOfMemoryError 발생 가능
- Old 영역의 크기를 늘리면 Full GC의 발생 빈도를 줄일 수 있지만, Full GC의 수행시간이 늘어남
- 적절한 Old 영역의 크기 설정
(3) GC 방식
a. Serial Collector
- Young 영역과 Old 영역이 연속적으로 처리되며 하나의 스레드를 사용
- Mark-Sweap-Compaction 알고리즘
b. Parallel GC
- Minor GC를 여러 개의 스레드로 처리
- Mark-Sweap-Compaction 알고리즘
c. Parallel Old GC
- Minor GC와 Major GC를 여러 개의 스레드로 처리
- Mark-Summary-Compaction 알고리즘
d. CMS GC
- GC 과정에서 발생하는 STW(Stop the world) 시간 최소화에 초점
- GC 대상을 최대한 정확히 파악후, STW에 걸리는 시간을 줄임
- Initial Mark -> Concurrent Mark -> Remark -> Concurrent Sweap
- Compaction 작업은 필요한 경우에만 수행
e. G1 GC
- 큰 힙 메모리에서 짧은 GC 시간을 보장하는데 목적
- 전체 힙 메모리 영역을 Region이라는 특정한 크기로 나눔
- 각 Region의 상태에 따라 역할(Eden, Survivor, Old)를 동적으로 부여
'CS > Java' 카테고리의 다른 글
[자바] Static (0) | 2020.06.29 |
---|---|
[자바] 데이터타입 (0) | 2020.06.29 |
[자바] Collection Frameworks (0) | 2020.06.29 |
[자바] 자바가상머신(JVM, Java Virtual Machine) (0) | 2020.06.29 |
[자바] 객체지향언어(Object Oriented Programming) (0) | 2020.06.29 |
댓글