Garbage Collection
GC는 무엇인가
- 힙 영역에 있는 unreachable 메모리를 청소하는 역할
- 힙 영역?
- 개발자가 직접 관리하는 메모리 영역
- 개발자에 의해 메모리 공간이 동적으로 할당되고 해제
Unreachable 메모리의 정의
- 각 객체들의 상호 참조여부를 기반으로 판단하는게 아닌
GC root에서 이 객체에 접근할수있냐 없냐로 reachable, unreachable 판단
GC root의 예시
- 실행중인 스레드
- 정적변수
- 로컬변수
- 힙 영역내 다른 객체의 의한 참조
- JNI 레퍼런스
Mark and Sweep
- GC 의 대표적인 알고리즘 중에 하나
- Mark
- 힙 영역에 할당된 객체들을 체크하며 GC root에서 참조된 객체들을 예의주시 하는 과정
- Sweep
- 그 중 unreachable한 메모리를 수거하는 과정
GC의 동작 방법
- 힙 영역의 구분: New Generation / Old Generation
- New Generation의 구분: Eden, Survivor 0, Survivor 1
- 힙 영역내에 GC 동작
- 새롭게 할당되는 객체는 Eden 영역에 위치
- Eden 영역이 꽉 차게 되면 -> GC 발생
- GC 발생 후 살아남은 객체들은 Survivor 0영역으로 이동
- 이때 살아 남았다는 의미의 age bit 값을 +1 살아남을때 마다 해준다.
- Survivor 0 영역이 꽉차게 되면 -> GC 발생
- 또 다시 살아남은 객체들은 Survivor 1 영역으로 이동 하고 Survivor 0 영역 클리어
- 다시 새로운 객체들이 생성되고 꽉차게 되면 GC 발생후 Survivor 1 영역으로 이동
- Survivor 1 영역도 꽉차게 되면 GC 후 Survivor 0 영역으로 객체 이동
- Old Generation
- 이 영역으로 옮겨지는 객체들은 age bit 값에 따라 좌우된다.
- 특정 age bit 값을 만족하는 객체들은 old generation 영역으로 옮긴다 -> Promotion
- 특정 age bit 값은 설정 가능
GC 종류
- Minor GC
- Full GC(Major GC)
- 결국 GC는 메모리가 꽉차면 동작
OOM
- 힙 영역에서 GC가 동작해도 수거할 객체가 없는데 새로운 객체를 힙 영역에 저장하려고 할때 발생
참조 유형 - GC가 동작할 때 우선 순위를 매길 수 있다면?
- Strong reference
- new 키워드를 통해 생성되는 객체
- GC의 수거 대상에서 제외
- Soft reference
- 때에 따라 될 수도 안 될 수도 있는 객체
- 메모리가 여유롭다면 안 될 수도있다.
- Weak reference
- GC 동작 시 바로 바로 수거
- reachable해도 바로 수거
- 이 객체가 참조하는 하위 객체들도 바로 gc 대상
GC를 계속 동작하게 만들면 어떻게 되나?
- 비효율
- Stop the world 현상
- GC가 동작하면 관련 스레드를 제외한 나머지 스레드는 모두 멈춘다.
- 대용량을 다룰때, 혹은 빠른 처리를 해야할때 GC가 계속 동작한다면?? No
자바 11
- New / Old 로 구분하지 않고, 힙 영역을 Region 단위로 쪼개놓음
- 그래서 메모리가 꽉찬 Region만 GC하여 더 신속
- Mark and sweep에 더불어 사용하고 있는 메모리들을 모아서 더 효율적으로 메모리를 사용할 수 있게 Compaction이라는 단계도 추가
참조
메모리 기본구조
Java Reference와 GC
IMDEV 2023 혼자서도 잘하는 메모리 청소부 쥐씨
가비지 컬렉터(Garbage Collector)와 Mark & Sweep