[Java] 가비지 컬렉션(Garbage Collection, GC)

Jay Lee·2022년 12월 26일
0

Java

목록 보기
2/2

Garbage Collection(GC)

Garbage Collection이란?

Garbage Collection은 JVM에서 제공하는 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 관리해주는 기법입니다.

GC의 장점

  • 개발자 입장에서 메모리 관리 및 메모리 누수 문제에서 대해 집중적으로 관리하지 않아도 되기 때문에 비지니스 로직에 집중할 수 있다.

GC의 단점

  • 개발자가 메모리 해제 시점을 알 수 없다.
  • GC가 동작하는 동안 다른 동작을 멈추어야 하기 때문에 오버헤드가 발생한다.

Garbage Collection의 대상이 되는 객체들

객체들은 실직적으로 Heap영역에서 생성되고 Method Area나 Stack Area 등 Root Area에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성된다. 이 때, Heap 영역에서 참조되지 않는 객체들을 Unreachable이라고 하며 GC의 대상이 된다.


Garbage Collection의 대상이 되는 Heap 영역


Heap Area는 효율적인 GC를 위해 Eden, Survival, Old Generation으로 나뉩니다.


Garbage Collection의 과정

가비지 컬렉션은 크게 두가지 과정으로 이루어진다.
1. Stop The World - JVM이 어플리케이션의 실행을 잠시 멈추고, GC를 위한 쓰레드를 제외한 나머지 쓰레드들의 작업을 모두 중단한다.
2. Mark and Sweep - 루트에서부터 해당 객체에 접근 가능 여부를 기준으로 UnReachable객체를 판단하고 사용하지 않는 메모리를 제거한다.

Mark : 먼저 Root로부터 그래프 순회를 통해 연결된 객체를 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹
Sweep : 참조하지 않고 있는 객체를 Heap에서 제거
Compact : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 할당되지 않은 부분으로 압축


Garbage Collection의 세부 동작 과정

  1. 객체가 처음 생성되고 Eden 영역에 age-bit 0으로 할당됩니다. age-bit은 Minor GC에서 살아남을 때마다 1씩 증가합니다.
  2. Eden 영역이 꽉 차게되면 Minor GC가 일어나게 되고 Mark and Sweep과정을 통해 Survival0 영역으로 이동하거나 메모리에서 제거됩니다.
  3. Eden영역에 객체가 다 쌓이게 되면 Young Generation(Eden + Survival)영역에 있는 객체들을 비어있는 Survival인 Survival1 영역에 이동하고 살아남은 모든 객체들은 age가 1씩 증가합니다.
  4. 위의 2-3 과정을 Survival0과 Survival1을 번갈아가며 반복합니다.
  5. age bit가 특정 숫자 이상(JVM에서 설정해놓은 age-bit)이 되는 객체가 발생하였을 때 해당 객체를 Old Generation영역으로 이동시킵니다. 이를 Promotion이라고 합니다.
  6. Old Generation 영역의 메모리가 허용치를 넘게 된다면 Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한번에 삭제하는 Major GC가 실행됩니다. 이 때, Stop The World 작업이 일어납니다.
profile
Data Engineer

0개의 댓글