Garbage Collection
Garbage Collection
Garbage Collection
- 더 이상 유효하지 않은 메모리를
garbage
라고 함 (ex: 참조가 해제된 객체) - C언어에서는
free()
함수를 통해 직접 메모리를 해제해야 함 - 자바는 JVM의 garbage collector(GC)가
garbage
를 정리해주고, 이를garbage collection
이라고 함 - 개발자가 제어하지 않아도 돼 개발에 집중 가능하게 해 줌
- 개발자가 메모리 해제 시점을 알기 힘들다는 단점 존재
Heap 영역의 구분
- 자바에서 대부분의 객체는 일회성이며 금방
garbage
가 됨 - 객체의 생존 기간에 따라 영역을 다르게 하기 위해, heap 영역을 다음과 같이 두 가지 영역으로 구분
- Young 영역
- 새롭게 생성된 객체가 할당되는 영역
- 대부분의 객체는 young 영역에 생성된 후 사라짐, 크기가 작음
- 이 영역에 대한 GC를
minor GC
라고 함 - 내부적으로는
eden
영역과 두 개의survivor
영역 존재 - 이 때
survivor
영역은 두 개 중 하나씩 번갈아 가며 사용되고, 나머지 하나는 비워 둠
- Old 영역
Young
영역에서 살아남은 객체가 할당되는 영역Young
영역 보다 크며,garbage
가 적게 발생- 이 영역에 대한 GC를
major GC
라고 함
GC 동작 방식
다음과 같은 두 가지 단계로 수행됨
Stop the world
- 가비지 컬렉션을 수행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
- GC 외의 쓰레드가 중단되고, GC의 활동이 끝나면 쓰레드들이 재개됨
- 다른 작업이 멈추므로 오버헤드가 발생함. 최대한 이 작업 시간을 줄여야 함
Mark and sweep
- Heap 영역에서 사용되고 있는 객체를 식별해서 마킹하는
mark
작업 수행 mark
되지 않은 객체를 제거하는sweep
작업 수행- 일부 GC는
sweep
후 남은 객체들을 heap의 시작 주소로 압축하는compact
작업도 수행
- Heap 영역에서 사용되고 있는 객체를 식별해서 마킹하는
Minor GC 동작 방식
Eden
영역이 다 차면 수행됨Eden
영역에서 사용되지 않는 객체는 해제되고, 사용되는 객체는 비어있는survivor
영역으로 이동됨- 기존에
survivor
영역에 있던 객체도 비어있는survivor
영역으로 이동됨 - 이렇게
survivor
영역을 이동할 때 마다 각 객체의 age가 1씩 증가 - Age가 일정 이상인 객체는 old 영역으로 이동(promotion)됨
Young
영역의 크기가 작기 때문에 이 과정은 빨리 끝나며, 성능에 영향이 적음
Major GC 동작 방식
Old
영역이 다 차면 수행됨Old
영역은 큰 만큼 가비지 컬렉션에 오랜 시간이 걸리며, 성능에 큰 영향을 줌- Major GC는 자주 발생되지 않음