[CS] 가비지 컬렉션(Garbage Collection)

박현우·2021년 11월 10일
0

CS

목록 보기
17/20

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

  • 메모리 관리 방법 중에 하나로, 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 기법입니다.
  • 일반적으로 Heap 영역의 오브젝트 중 stack 에서 도달 불가능한 (Unreachable) 오브젝트들은 가비지 컬렉션의 대상이 됩니다.
    [사진 출처]
  • 시스템에서 가비지 컬렉션을 수행하는 부분을 가비지 컬렉터라 부릅니다.
  • 더이상 사용되지 않는 데이터를 null로 재선언하는 방법을 이용해 명시적으로 메모리할당을 해제할 수 있습니다.
  • JVM이라는 가상머신의 가비지 컬렉터가 가비지 컬렉션을 실행합니다.
    JVM? Java와 OS 사이의 중개자 역할을 하는 Stack기반의 가상머신. OS에게 자바 어플리케이션을 실행하기 위해 필요한 메모리 영역을 할당 받는다.

GC의 동작 방식

Heap 영역을 설계할 때, 크게 두 가지로 나누게 되었는데 Young 영역과 Old 영역으로 나누었습니다.

Young 영역

새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.

Old 영역

접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.


Young, Old 영역이 할당받는 메모리 크기가 다르므로(일반적으로 Old영역을 더 크게 할당),구조 역시 다릅니다. 하지만 어떤 GC알고리즘을 구현해도 다음 두 가지의 공통 단계를 따릅니다.

1. Stop The World

  • 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업.
  • GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개된다.
  • 당연히 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈추기 때문에, GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 하는 것이다.

2. Mark and Sweep

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

GC의 한계

  • 어떤 방식의 GC를 해도 어플리케이션을 중단해야 하기 때문에 성능 하락을 피할 수 없습니다.
  • GC는 더이상 접근이 불가능한 객체만 회수하기 때문에 메모리 누수가 발생합니다.

ref.

0개의 댓글