[자바] 25. Garbage Collector(GC)란? + 동작 방식 + 동작 알고리즘
kyupid opened this issue · 1 comments
Garbage Collector(GC)란? + 동작 방식 + 동작 알고리즘
틀린 부분 있으면 피드백 부탁드리겠습니다 🙏
동작 알고리즘은 Mark and sweep 에 대해서만 설명하도록 하겠습니다.
자바에서는 C와 C++과 달리 사용하지 않는 객체를 JVM 실행 엔진 내 GC가 제거합니다
GC가 담당하는 영역은 객체가 저장되는 Runtime Data Area의 Heap 영역입니다.
Heap영역은 크게 Young, Old Generation로 나눌수 있습니다
Young Gen은 다시 Eden, Survivor0,1 총 세 영역으로 또 나뉘어집니다
GC는 업무를 수행하는데에 여러가지 알고리즘을 선택하여 사용할 수 있습니다
그중에서 Mark and sweep 방식은 객체를 추적하여 Reachable한지 Unreachable한지 객체마다 체크를 해두는 방식입니다
먼저 객체가 생성이되면 Eden 영역에 먼저 쌓입니다.
이 Eden 영역에 객체가 모두 쌓이게 되면 GC가 발생합니다.
참고로 Young Gen 에서 일어나는 GC를 Minor GC라고 합니다
Eden 영역에서 GC가 발생하면 Mark and sweep으로 체크해둔 Unreachable한 객체들을 제거가 되고
Reachable한 객체들을 Eden 영역 -> Survivor 0로 옮겨집니다
그리고 다시 객체들이 Eden영역에 쌓이게 됩니다
또 꽉차게 됩니다
GC가 발생합니다.
또 Survivor0 영역으로 옮겨집니다
이런 과정이 연속으로 진행됩니다
한가지 알아두어야할것은 Survivor0,1은 한쪽이 쌓이면 한쪽은 텅빈공간입니다
예를들어 Minor GC가 일어났을때 Survivor 0에 객체들이 있으면
Unreachable한 객체들이 제거되고 살아남은 객체들은 Survivor 1로 옮겨지게 되는것입니다
이런 과정들 각 객체들은 나이(old)가 먹게 되는데요
설정값에 따른 특정 나이를 먹게되면 그 객체는 Old Generation으로 옮겨집니다
참고로 Young -> Old Gen 으로 갈때 Promote 했다고 표현합니다
Old Generation이 꽉차면 어떻게 될까요?
이때 Major GC (Full GC)가 발생하게 됩니다
이런식으로 GC가 동작합니다
추가적으로 중요한점은 Full GC가 발생할때 앱이 일시정지하게 됩니다
참고로 이것을 STW(Stop-The-World)라고 합니다
앱이 일시정지가 되기때문에
이런 Full GC가 빈번하게 일어나거나 소요시간이 길어지면
앱으로 들어오는 요청들이 대기상태가 잦거나 길어집니다
그래서 Full GC를 모니터링하는 것이 필요하기도 합니다