설명 순서는 다음과 같습니다.

1. Garbage Collector란?
2. Garbage Collection 대상
3. Garbage Collector의 청소 방식(Mark And Sweep)
4. Heap 메모리 구조
5. Garbage Collection 과정

1. Garbage Collector란?

   - 자바의 메모리 관리를 해주는 역할

   - JVM의 Heap 영역에 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 제거해줌

   - C / C++ 에서는 Garbage Collector가 없어서 프로그래머가 수동으로 메모리 할당과 해제를 해줘야 했음. 그렇지만, Java에서는 Garbage Collector가 메모리 관리를 해주므로 오로지 개발에만 집중할 수 있다는 장점이 있음

   - 그렇지만, Garbage Collector가 메모리를 관리하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있음. 이를 전문 용어로 Stop The World라고 하고 이 시간을 줄일수록 성능이 올라가며 이런 최적화 작업을 GC 튜닝이라고 함


2. Garbage Collection 대상

   - Garbage Collector는 ① Heap에서 사용되지 않는 객체를 찾고, ② 지움

   - 사용되지 않는 객체란 해당 객체가 어디에서도 참조되지 않는 객체를 의미함(Unreachable 상태)

   - 위 그림처럼 어디에서도 참조되지 않는 Heap의 객체를 Garbage Collector는 제거해야할 메모리로 인식하고 지워줌


3. Garbage Collector의 청소 방식(Mark And Sweep)

   - Mark And Sweep 방식은 Garbage Collector의 기초적인 청소 방식임

   - 과정

      ① Mark : Root Space로부터 그래프 순회를 통해 어떤 객체가 참조되고 있는지 찾아서 마킹함(청소 대상 마킹)

         * Root Space : Heap 메모리 영역을 참조하는 Method Area, static 변수, stack 등이 됨. 이 root부터 찾아가며 heap에 있는 객체가 참조되고 있는지 판별

      ② Sweep : 참조되고 있지 않은 객체(청소 대상)을 Heap에서 제거함(청소함)

      ③ Compact : 청소 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축


4. Heap 메모리 구조

   - Heap은 동적으로 생성된 객체들이 저장되는 공간으로, 가비지 컬렉션의 대상이 됨

   - Heap은 2가지 전제로 설계되었음

      ① 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다

      ② 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다

      -> 객체는 대부분 일회성이고, 메모리에 오래 남아있는 경우는 드물다는 뜻

   - 이러한 특성을 이용해서 Heap영역을 Young과 Old로 나눔

      ① Young

         * 새로 생성된 객체가 할당되는 영역

         * 대부분의 객체가 금방 Unreachable이 되기 때문에, Young에서 생성되었다가 사라짐

         * Young에 대한 가바지 컬렉션을 Minor GC라고 부름

      ② Old

         * Young에서 Reachable 상태를 유지해서 살아남은 객체가 복사되는 영역

         * Young보다 크게 할당되며, 그만큼 가바지 컬렉션은 적게 발생함

         * Old에 대한 가비지 컬렉션을 Major GC라고 부름

   - Young은 효율적은 GC를 위해 다시 Eden, Survivor0, Survivor1로 나뉨

      ① Eden : new를 통해 새로 생성된 객체가 위치. GC후 살아남은 객체들은 Survivor로 보냄

      ② Survivor 0/1 : 최소 1번의 GC 이상 살아남은 객체가 위치. Survivor 0/1 둘 중 하나는 꼭 비어있어야 함


5. Garbage Collection 과정

   (1) 처음 생성된 객체는 Young의 Eden 영역에 위치

   (2) 객체가 계속 생성되어 Eden이 꽉차게 되면 Minor GC가 실행

   (3) Mark를 통해 Reachable 객체를 탐색

   (4) Eden에서 살아남은 객체는 Survivor 0 또는 1 영역으로 이동

   (5) Eden 영역에서 Unreachable 객체의 메모리를 해제(청소)

   (6) 살아남은 객체들의 age값이 1 증가

   (7) Eden 영역이 다시 가득 차면 Minor GC를 실행하고(Survivor영역도 같이 청소), 이제 살아남은 객체를 모두 Survivor 1로 보냄

   (8) 이후 객체의 age가 임계값에 도달하면 이 객체를 Old로 보냄

   (9) Old 영역이 가득 차면 Major GC를 실행

   - Old 영역은 Young 영역에 비해 크기가 크기 때문에 GC가 10배 이상의 시간이 소요됨

   - 이렇게 Major GC가 일어날 때 성능이 나빠지는데, 이 때 성능을 높이기 위해 가비지 컬렉션 알고리즘이 발전함


Garbage Collector에 대해 알아볼 수 있었습니다.

'Java' 카테고리의 다른 글

Stream  (0) 2023.09.19
JAR, WAR, EAR  (1) 2023.09.18
JVM  (0) 2023.09.14
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] Static이란?  (0) 2023.04.07

+ Recent posts