본문 바로가기

Back-end/Java

[Java] 가비지 컬렉션(Garbage Collection)의 과정

가비지 컬렉터(Garbage Collector)란?

 

'더이상 참조되지 않은 메모리'인 가비지를 청소해주는 JVM의 실행 엔진의 한 요소입니다.

JVM은 new와 같은 연산에 의해 새롭게 생성된 객체들 중에서 더이상 참조되지 않는 객체를 정리해줍니다.

가비지 컬렉터Heap 영역을 위주로 탐색하여 메모리를 정리해줍니다.

 

 

가비지 컬렉션(Garbage Collection)의 과정

 

가비지 컬렉션(GC)은 메모리를 정리하는 과정입니다.

GC는 Heap 영역에서 사용하지 않는 객체들을 제거하는 작업을 총칭합니다.

이 객체를 제거하는 작업이 필요한 이유는 자바는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기 때문입니다.

따라서 객체를 사용하고 제거하는 기능이 필요하게 됩니다.

 

GC의 동작방식은 가장 간단한  Serial GC 방식으로 설명합니다.

GC를 수행할 때는 메모리의 사용을 중단한 채로 진행이 되어야 합니다.

JVM은 GC를 실행하기 위해 애플리케이션의 실행을 멈추는 stop-the-world를 먼저 실행하게 됩니다.

stop-the-world를 실행하면 GC를 실행하는 쓰레드를 제외모든 쓰레드가 작업을 멈춥니다.

그리고 GC가 끝나면 다시 작업을 재개합니다.

GC의 작업Young 영역에 대한 Minor GCOld 영역에 대한 Major GC로 구분됩니다.

 

  • Young 영역: 새롭게 생성한 객체들이 위치한다. 대부분의 객체는 금방 접근 불가능한 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • Old 영역: Young 영역에서 계속 사용되어 살아남은 객체가 복사되는 영역이다. Young 영역보다 크게 할당되며, 더 적은 GC가 발생한다.

Young 영역은 또 1개의 Eden 영역2개의 Survivor 영역으로 구성되는데, Young 영역에 대한 GC는 다음과 같이 작동한다.

  1. 새로운 객체가 Eden 영역에 생성됨
  2. Eden 영역에 GC가 동작하고, 그 중에서 살아남은 객체가 Survivo0으로 이동함
  3. 2번 동작이 반복되어 Survivo0 이 꽉차게 됨
  4. Survivor0 영역에 GC가 동작하고, 살아남은 객체들은 Survivor1으로 이동하고 Survivor0을 비우게 됨
    (2개의 Survivor 영역 중 1개는 반드시 비어있어야 됨)
  5. 위의 동작들이 반복되어 특정 횟수만큼 살아남은 객체는 Old 영역으로 이동함

 

그리고 Old 영역이 가득차서 Survivor 영역에서 Old 영역으로 Promotion이 불가능할 때 Old 영역에 대한 GC(Major GC)가 실행됩니다.

 

참고: https://mangkyu.tistory.com/94