2019년 1월 31일
GC (Garbage Collection)
I. JVM 메모리 정리기능, Garbage Collection의 개요
가. GC(Garbage Collection)의 정의
- JAVA 어플리케이션이 사용하지 않는 메모리를 자동으로 수거하는 JVM 메모리 할당 해제 기능
나. 메모리 정리 관련 JAVA와 C 언어의 차이
JAVA | C |
---|---|
– JVM의 Garbage Collection 자동 수행 – 자동 메모리 정리 heap영역 확보 | – free() 로 수동 해제 필요 – 메모리 미해제 시 누수 발생 |
- 최적의 성능을 위해 Full/Minor GC로 나뉘어 수행
II. Minor GC와 Full GC의 개념
Minor GC | Full GC |
---|---|
New/Young영역에서 발생하며 객체 할당 영역 Full 상태 시 사용되지 않는 객체 제거하는 JVM 메모리 정리 기능 | Old 영역에서 발생하며 생성 주기가 오래된 객체 제거 후 힙 정렬 수행하는 JVM 메모리 정리 기능 |
- JVM에서 Minor/Full GC를 통해 시스템의 메모리 관리
III. Garbage Collection 알고리즘 종류
가. Garbage Collection 위한 JAVA 메모리(Heap) 구조
New/Young 영역 | – Java 객체 생성 시 저장되는 영역 – 생긴지 오래되지 않은 객체가 저장 |
Old 영역 | – New/Young 영역에서 저장되었던 객체 중 오래된 객체가 이동되어 저장되는 영역 |
Perm 영역 | – Class, Method 같은 Code가 저장되는 영역으로 JVM에 의해 사용 |
나. Garbage Collection의 주요 알고리즘
구분 | 알고리즘 | 특징 |
---|---|---|
Minor GC | Copy & Scavenger | – 고속, 작은 크기의 메모리를 Collection 하는데 효과적 |
Parallel GC | – Multi Thread를 이용하여 Minor GC를 병렬로 더욱 빠르게 수행 | |
Full GC | Mark & Compact | – 객체의 사용 유무 Mark, 객체 삭제 – 저속, 순간적 APP멈춤 현상 발생하므로 APP의 성능과 안정성에 영향 |
Concurrent GC | – Full GC 수행 시 프리징 현상 최소화 – 일부 GC는 APP가 동작하는 단계에서 수행, 최소한만 APP 정지 후 수행 | |
Other | Incremental GC | – Minor GC 시 Full GC영역 조금씩 수행 – Full GC 회수와 시간을 줄이는 방법 |
G1 Collector | – Java 7 G1 메모리 관리자, 멈춤 최소화 – 대용량 메모리, 다중 프로세스 기반 |
- APP 형태나 H/W Spec에 따라 충분한 테스트를 거쳐 적합한 GC 알고리즘 선택이 성능 향상 방법
IV. Minor GC와 Full GC 상세 절차
가. Minor GC 상세 절차
단계 | 개념도 | 상세 동작 |
---|---|---|
① | – Eden에서 Alive된 객체를 Survivor1으로 이동 – Eden 영역 Clear | |
② | – Eden 영역에 Alive된 객체와 S1 영역에 Alive된 객체를 S2에 Copy – Eden영역과 S1 Clear | |
③ | – 객체가 오래되면 Eden과 S 영역의 오래된 객체 Old영역으로 이동 |
- Minor GC는 매우 속도가 빠르며 작은 크기의 메모리를 Collecting 하는데 매우 효과적
나. Full GC 상세 절차
개념도 | 상세 동작 |
---|---|
– Mark & Compact 이용 – Reference가 연결되지 않는 객체 삭제 – 실제로 Mark 객체를 사용하는 객체로 변경 |
- Full GC 시 순간 Java APP 프리징 현상으로 성능과 안정성에 매우 큰 영향
V. Minor GC와 Full GC의 비교
항목 | Minor GC | Full GC |
---|---|---|
메모리 영역 | New/Young 영역 (Eden과 Survivor 영역) | Old 영역 발생 객체 삭제 및 힙 정렬 |
발생 빈도 | Garbage가 자주 발생하므로 빈도 높음 | 상대적으로 발생 빈도 낮음 |
알고리즘 | Copy & Scavenge 알고리즘 | Mark & Compact 알고리즘 |
메모리 단편화 | 객체 이동 시 자동 정렬 | 객체 삭제 시 힙 정렬 수행 |
GC 속도 | 메모리 정리 속도 매우 빠름(0.5초 이내) | 메모리 정리 속도 매우 느림 (수 초 소요) |
영향도 | 빠른 수행으로 APP 영향 없음 | GC수행 중 APP수행 불가 |
- 원활한 서비스를 위해 GC 발생 방법에 따라 시스템의 안정성과 성능에 변수로 작용
VI. 최적의 성능을 위한 GC 알고리즘
향상 포인트 | GC 알고리즘 | 해당 GC |
---|---|---|
속도 중시 | Parallel GC | Minor GC(4CPU 이상) |
응답성 중시 | Concurrent GC | Full GC(4CPU 이상) |
응답성 중시 | Incremental GC | Full GC(4CPU 미만) |
- JAVA 튜닝 시 지속적인 테스트를 통해 최적의 parameter와 GC 알고리즘 선택 필요