가비지 컬렉션
가비지 컬렉션은 불필요한 메모리를 정리를 해주는 프로세스로만 단순히 알고 있었습니다. 이번에는 가비지 컬렉션에 대해 더 자세히 알아보고 정리를 해보겠습니다.
가비지 컬렉션의 대상
객체들은 실질적으로 Heap영역에서 생성되고 Method Area이나 Stack Area 에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성됩니다. Heap에 있는 객체에 참조가 있으면 Reachable 참조가 없으면 Unreachable로 구분을 하고 가비지 컬렉션은 Unreachable된 객체를 정리합니다.
- Reachable : 객체가 참조되고 있는 상태
- Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됩니다.)
Mark and Sweep 알고리즘
Mark
가비지 컬렉션에는 GC Root가 존재합니다. 루트로부터 그래프를 순회하여 연결된 객체들을 찾아내어 각각 어떤 객체를 잠조하고 있는지 찾아서 마킹합니다.
Sweep
Unreachable 객체들을 모두 제거합니다.
Compact
Sweep 후에 흩어져있는 객체들을 Heap의 시작 주소로 모아 정렬합니다.(가비지 컬렉터 종류에 따라 하지 않는 경우도 있습니다.)
가비지 컬렉션의 동작과정
Heap의 구조
heap영역은 크게 Young Generation와 Old Generation으로 이루어져 있다. 이는 메모리를 효율적으로 관리하기 위해서입니다.
Heap 설계의 두 가지 전제
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 됩니다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재합니다
Young Generation은 새롭게 생성된 객체가 할당되는 영역으로 이 영역에 대한 가비지 컬렉션을 Minor GC라고 부릅니다.
Old Generation은 Young Generatio에서 살아남은 객체가 복사되는 영역으로 Young Generatio영역 보다 크게 할당이 되어지며 이 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부릅니다.
Young Generation의 구조
Young Generation 영역은 Eden, survivor 0, survivor 1 로 나누어집니다.
Eden
- 새롭게 생성된 객체가 위치하는 영역
- 이 영역에서 살아남은 객체는 survivor영역으로 이동
survivor 0, survivor 1
- 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
- Survivor 영역에는 특별한 규칙이 있는데, Survivor 0 또는 Survivor 1 둘 중 하나는 꼭 비어 있어야 합니다.
Minor GC 과정
Young Generation의 공간은 Old Generation에 비해 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는데 적은 시간이 걸립니다.
- 새롭게 생성된 객체는 Eden 영역에 위치합니다.
- Eden 영역이 가득 차게 되면 Minor GC가 실행됩니다.
- Mark 동작을 통해 Reachable를 찾습니다.
- 찾은 Reachable 객체를 survivor 0으로 이동시킵니다.
- Eden 영역을 Sweep합니다.
- 살아남아 이동시킨 객체에 age를 ++합니다.
- 다시 den 영역이 가득 차게 되면 Minor GC가 실행됩니다.
- Mark 동작을 통해 Reachable를 찾습니다.
- 찾은 Reachable 객체를 survivor 1으로 이동시킵니다.
- 살아남아 이동시킨 객체에 age를 ++를 반복합니다.
age
살아남은 객체에 age를 계속 증가시키고 있는데 age 값을 기준으로 Young Generation 영역에서 Old Generation 영역으로 이동을 시킵니다. VM 중 가장 일반적인 HotSpot JVM의 경우 이 age의 기본 임계값은 31입니다.
Major GC 과정
Major GC는 Old Generation에 데이터가 가득 차면 GC를 실행하는 단순한 방식입니다.
Major GC가 실행되면 Old Generation 영역에 있는 Mark and Sweep 과정을 거치게 됩니다.
Old Generation은 Young Generation에 비해 상대적으로 큰 공간을 가지고 있어, 이 공간에서 메모리 상의 객체 제거에 많은 시간이 걸리게 됩니다.
여기서 Stop-The-World 문제가 발생되는 이러한 문제를 해결하기 위해 가비지 컬렉션 알고리즘을 발전 시켜왔습니다. 다음에는 가비지 컬렉션 알고리즘에 대해서 정리를 해보겠습니다.
단점
- 메모리가 언제 해제되는지 정확하게 알 수 없습니다.
- 가비지 컬렉션이 동작하는 동안에 다른 동작을 멈추기 때문에 오버헤드가 발생합니다.
Stop-The-World
- GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상을 의미합니다.
- GC가 작동하는 동안 GC 관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있습니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
equals() (0) | 2025.02.16 |
---|---|
System.out.print (0) | 2025.02.16 |
동기&비동기, 블로킹&논블로킹 (0) | 2025.02.16 |
Comparable, Comparator (0) | 2025.02.16 |
Optional 개념 및 사용법 (2) | 2025.02.16 |