Garbage Collection (추가 내용)

smj_716·2025년 1월 17일

Java-study / live-study

목록 보기
3/16

1. Garbage Collection(가비지 컬렉션)이란?

자바의 메모리 관리 방법 중 하나로 JVM의 Heap영역에서 동적로 할당했던 메모리 중 필요없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스를 말한다.

C언어나 C++같은 언어는 수동으로 메모리를 관리하도록 설계되어 개발자가 메모리 사용 후 운영체제에 반환하지 않고 프로세스가 점점 커진다면 "메모리 닉"버그가 발생한다. 반면 JAVA는 JVM을 통해 메모리를 할당받고 사용되지 않는 메모리는 JVM이 알아서 회수한 다음 해제해준다. JVM의 이러한 메모리 해제 동작을 가비지 컬렉션이라고 하며, 이러한 가비지 컬렉션을 수행하는 주체를 가비지 컬렉터라고 한다.

Product product = new Product("TV");
sellTo(product);
product = null;
Person person = new Person("Dave");
person.sayHello();

person = new Person("Eric");
person.sayHello();

위 코드 각각의 첫 줄에서 new Product("TV")new Person("Dave")는 메모리 Heap영역에 할당되었을 것이다. 그 후 해당 메모리 영역을 가리키던 productnull이 되고 person새로운 객체를 참조하게 된다. 이때 이전 참조되었던 new Product("TV")new Person("Dave")객체는 어떠한 경로로도 참조되지 않는 Unreachable 상태가 되고 가비지로 판단되어 회수당하는 것이다.


2. 가비지 컬렉션 동작 방식

➡️ Stop the world (STW)

GC가 실행되기 전에 GC가 안전하게 객체를 검사하고 메모리를 해제하기 위해 모든 애플리케이션 스레드가 멈추는 현상이다.

모든 GC 알고리즘에서 공통적으로 발생하고 GC의 종류와 구현 방식에 따라 정지 시간이 달라진다. GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop the word의 시간을 줄이는 작업을 하는 것이다.

➡️ Mark and Sweep

  • Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
  • Sweep : Mark단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

Stop The Word를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각 어떤 객체를 참조하고 있는지 탐색한다. 이 과정에서 사용되고 있는 메모리를 식별하고(Mark) Mark되지 않은 객체들을 메모리에서 제거(Sweep)한다.


3. JVM의 힙 메모리 구조

JVM의 Heap 영역은 처음 설계될 때 아래 2가지 전제로 설계된다.
1. 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 됨
2. 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재함

즉, 대부분 객체는 일회성이며 메모리에 오랫동안 머무는 경우는 드물다는 뜻이다. 따라서 JVM 메모리는 객체의 생존 시간에 따라 물리적이 Heap영역을 Young(Eden/Survivor), Old 2가지 영역으로 나누었다.

🌟 Young Generation (Young 영역)

  • 새롭게 생성된 객체가 할당되는 영역
  • 대부분의 객체는 이곳에서 금방 소멸됨
  • Eden영역과 두 개의 Survivor영역(s1, s2)으로 구성됨
  • Young 영역에서 발생하는 GC를 Minor GC라고 부름
  • Minor GC는 상대적으로 빈번하게 발생하지만 짧게 끝남

🌟 Old Generation (Old 영역)

  • Young 영역에서 Reachable 상태를 유지하여 살아남은 객체들이 이동하는 영역(이때 이동을 Promotion이라고 함)
  • Old 영역에서 발생하는 GC를 Major GC라고 부름
  • 상대적으로 크기가 크며, GC 빈도는 낮지만 한 번 실행될 때 오래걸림

4. 가비지 컬렉션 동작 과정

📌 Minor GC

1. 객체 생성: 새로운 객체는 Eden 영역에 할당된다.
2. Eden 영역 가득 참: Eden 영역이 가득 차면 Minor GC가 발생한다.
3. Mark and Sweep 수행:

  • Eden 영역에서 사용되지 않는 객체를 식별하여 해제한다.
  • 살아남은 객체는 age를 부여받고 Survivor 영역(S0 또는 S1)으로 이동한다.

4. Survivor 영역 관리:

  • Survivor 영역 중 하나는 항상 비어 있어야 하며, 살아남은 객체는 번갈아 가며 S0와 S1을 오간다.

5. Promotion:

  • 이 과정을 반복하면서 age는 증가하며, 일정 age 이상이 되면 살아남은 객체는 Old 영역으로 이동(Promotion)한다.

📌 Major GC

1. Old 영역 가득 참: Old 영역의 메모리가 부족해지면 Major GC가 발생한다.
2. Mark and Sweep 수행:

  • Old 영역에서 사용되지 않는 객체를 식별하여 해제한다.
  • Major GC는 일반적으로 Minor GC보다 큰 공간을 가지고 있어서 시간이 오래 걸리며, 애플리케이션의 성능에 영향을 줄 수 있다.

0개의 댓글