JAVA
JVM의 Garbage Collector 정리
TedDev
2024. 9. 24. 09:31
728x90
JVM과 Garbage Collector (GC) 개요
JVM (Java Virtual Machine)
- 자바 애플리케이션이 실행되는 가상 머신 환경
- 메모리 관리와 GC를 통해 프로그램의 효율적 메모리 사용을 보장
Garbage Collector (GC):
- 힙(Heap) 메모리에서 더 이상 참조되지 않는 객체(가비지)를 자동으로 식별하고 제거하여 메모리 누수를 방지하고 메모리 자원을 재사용 가능하게 함
- GC는 수동 메모리 관리의 번거로움과 오류 가능성을 줄여줌
JVM 메모리 구조
- Heap 메모리 : 프로그램에서 생성된 객체가 저장되는 영역으로 크게 Young Generation과 Old Generation으로 나뉨
- Young Generation
- Eden 영역 : 새로운 객체가 최초로 생성되는 영역
- Survivor 영역 : Eden에서 살아남은 객체가 이동되는 두 개의 영역(S0, S1)
- Old Generation : Young Generation에서 여러 번의 GC를 거쳐 살아남은 오래된 객체가 저장되는 영역
GC의 동작 원리
- Marking (마킹) : GC는 스택에서 참조하고 있는 모든 객체를 찾아서 "살아있는 객체"로 마킹
- Sweeping (스위핑) : 마킹되지 않은, 즉 참조되지 않는 객체를 제거하여 메모리를 회수
- Compaction (압축) : 메모리 단편화를 방지하기 위해 객체를 한 곳으로 모아서 연속된 공간을 만듦
GC의 종류 및 특징
Serial GC
- 단일 스레드로 GC를 수행
- Young Generation과 Old Generation에서 순차적으로 GC를 수행
- 애플리케이션이 작거나 멀티 스레드가 필요 없는 환경에서 사용
Parallel GC
- 여러 개의 스레드를 사용하여 Young Generation을 동시에 처리
- 멀티 코어 환경에서 GC 성능을 높일 수 있음
- 대용량 애플리케이션에서 효율적
Concurrent Mark-Sweep (CMS) GC
- Old Generation에서 긴 멈춤 시간을 줄이기 위해 설계된 GC
- 동시 마크와 클리닝 작업을 수행하여 멈춤 시간을 최소화
- CPU 사용량이 증가할 수 있으며, 메모리 단편화 문제가 발생할 수 있음
G1 GC (Garbage-First GC)
- 힙 메모리를 Region이라는 작은 영역으로 나누어 관리
- GC가 필요한 영역만 선택적으로 청소하여 멈춤 시간을 예측 가능하게 함
- Old Generation의 GC를 효율적으로 수행하고, 대용량 애플리케이션에서 성능을 최적화
GC의 동작 과정
Minor GC
- Young Generation에서 발생하며, Eden 영역이 가득 찰 때 수행됨
- 객체가 Survivor 영역으로 이동하고, 더 이상 참조되지 않는 객체는 제거됨
Major GC (Full GC)
- Old Generation의 메모리가 가득 차거나, 메모리 부족 상황이 발생할 때 수행됨
- 모든 힙 영역을 검사하여 더 이상 참조되지 않는 객체를 제거
- 멈춤 시간이 길어 성능에 영향을 미칠 수 있음
Stop-the-World (STW)
- GC가 수행될 때 애플리케이션의 모든 스레드를 중단시키는 현상
- STW 시간이 길어지면 애플리케이션의 응답 속도가 저하될 수 있음
결론
- JVM의 GC는 자바 프로그램의 메모리 관리에 필수적인 역할을 하며 다양한 알고리즘과 옵션을 제공하여 애플리케이션 성능을 최적화할 수 있음
- 각 GC의 특성과 동작 방식을 이해하고 적절한 GC를 선택하여 사용하는 것이 중요. 이를 통해 애플리케이션의 성능과 안정성을 높일 수 있음
반응형