응애개발자
article thumbnail
Published 2024. 3. 1. 21:46
[Java] Garbage Collection(GC) 이란? CS/Java
728x90

Garbage Collection(GC) 이란?

가비지 컬렉션(Garbage Collection)은 자바의 메모리 관리 기법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스를 말합니다. C / C++언어에서는 가비지 컬렉션이 없어 수동으로 메모리 할당과 해제를 해줘야 하지만 Java는 가비지 컬렉터가 대행해 주기 때문에 한정된 메모리를 효율적으로 사용할 수 있습니다. 따라서 개발에만 집중할 수 있다는 장점이 있습니다.

가비지 컬렉션 vs 가비지 컬렉터
가비지 컬렉션은 사용하지 않는 메모리를 해제하는 행위를 말하고, 가비지 컬렉터는 행위의 주체(프로그램)를 말합니다.
즉 가비지 컬렉터가 가비지 컬렉션을 수행합니다.

 

Heap 메모리 구조

1. Young Generation (Young 영역)

  • 새롭게 생성된 객체가 할당되는 영역입니다.
  • 대부분의 객체가 금방 참조가 되지 않는 상태(Unreachable)가 되기 때문에, 많은 객체가 Young영역에 생성되었다가 사라집니다.
  • Young 영역에 대한 가비지 컬렉션을 Minor GC라고 부릅니다.

Young영역은 더욱 효율적인 GC를 위해 3가지 영역(Eden, survivor 0, survivor 1)으로 나눕니다.

1-1. Eden

  • new를 통해 새로 생성된 객체의 위치입니다.
  • 정기적인 가비지 수집 후 살아남은 객체들은 Survivor 영역으로 보내집니다.

1-2. Survivor 0 / Survivor 1

  • 최소 1번의 GC 이후 살아남은 객체가 존재하는 영역입니다.
  • Survivor 영역에는 특별한 규칙이 있는데, Survivor 0 또는 Survivor 1 둘 중 하나는 꼭 비어있어야 하는 것입니다.

이렇게 하나의 힙 영역을 세부적으로 나눔으로써 객체의 생존 기간을 면밀히 제어하여 GC를 보다 정확하게 불필요한 객체를 제거하는 프로세스를 실행합니다.

 

2. Old Generation (Old 영역)

  • Young 영역에서 참조되고 있는 상태(Reachable)를 유지하여 살아남은 객체가 복사되는 영역입니다.
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생합니다.
  • Old 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부릅니다.

Old 영역이 Young 영역보다 크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않고, 큰 객체들은 Young 영역이 아니라 Old 영역에 할당되기 때문입니다.

 

Minor GC 과정

 

모든 객체는 처음에 Young Generation에 생성됩니다.

Young Generation은 Old Generation에 비해 공간이 상대적으로 작기 때문에 객체를 찾아 제거하는데 시간이 적게 걸립니다.

 

1. 처음 생성된 객체는 Young Generaion Eden 영역에 위치합니다.

2. 객체가 계속 생성되어 Eden 영역이 꽉차게 되면 Minor GC가 실행됩니다.

3. 가비지 컬렉션이 될 대상을 식별하고, Eden영역에서 살아남은 객체는 Survivor 영역으로 이동합니다.

4. Eden 영역에서 사용되지 않는 객체는 메모리를 해제하고, 살아남은 모든 객체들은 age값이 1 증가하게 됩니다.

5. 또다시 Eden영역에 신규 객체들로 가득 차게 되면 Minor GC가 발생하게 됩니다.

6. 사용되는 객체들은 비어있는 survival 1 영역으로 이동하게 되고, 사용되지 않는 객체는 삭제가 됩니다.

7. 살아남은 모든 객체들은 age값이 1씩 증가하게 되고, 이 과정을 반복합니다. 그러다 임계값(JVM 중 일반적인 HotSpot JVM은 age 임계값이 31로 설정)이 차게 되면 Old Generation으로 이동하게 됩니다.

8. 위의 과정이 반복되어 Old Generation 영역의 공간(메모리)이 꽉차게 되면 Major GC가 발생됩니다.

 

Old Generation은 Young Generation에 비해 큰 공간을 가지고 있어, 이 공간에서 메모리 상의 객체 제거에 많은 시간이 걸리게 됩니다. 

 

Survivor 영역이 왜있으며 2개일까?

Heap의 Young 영역에서는 GC가 일어나지만 압축하는 과정이 일어나지 않습니다. 따라서 메모리 단편화가 발생하게 됩니다. 이때 GC 후에 Survivor 영역으로 옮기면서 재배치를 시키는데 이때 메모리 단편화를 제거해줍니다.

메모리 단편화
메모리의 공간이 작은 조각으로 나뉘어져 충분히 사용 가능한 메모리가 있음에도 시스템이 메모리 할당을 할 수 없는 상태를 의미합니다.

profile

응애개발자

@Eungae-D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!