본문 바로가기

IT

GC(Garbage Collection)

728x90

GC는 무엇인가

Garbage Collection의 약자로 개발자가 메모리를 직접 해제해주는 작업 없이 동적으로 할당된 불필요한 메모리를 자동으로 해제해주는 메모리 관리 기법

 

GC가 필요한 이유

프로그래머가 동적으로 할당된 메모리 영역의 전체를 완벽하게 관리할 필요가 없어져 불필요한 작업이나 메모리 누수를 방지할 수 있다.

 

GC의 대상이 되는 Heap 영역

힙(Heap)영역은 다음과 같이 Young generation, Old generation 두 가지로 나뉘어지고

Young generation에서 일어나는 GC를 Minor GC, Old generation는 Major GC라 한다.

Young generation는 새로운 객체들이 할당되는 영역, Old generation은 Young generation에서 오랫동안 살아남은 객체들이 존재하는 영역이다.

Young generation은 다시 Eden, Survival0, Survival1 3가지 영역으로 나뉘는데 새로운 객체들은 Eden 영역에 할당되며 Eden 영역이 꽉차게 되면 Minor GC 가 실행된다.

이 때 살아남은 객체들은 Survival0 영역으로 들어오게 되고 다음 Minor GC 가 또 실행되면 Survival1 영역으로 이동하게 된다.

한번 GC가 실행될 때 마다 살아남은 각 객체들 고유의 age 값이 증가하게 되고 age의 값이 특정 임계치를 넘어가기 전까지 GC가 실행될 때 마다 Survival0과 Survival1을 반복하며 이동한다.

age 값이 임계치를 넘어가게 되면 해당 객체는 오랫동안 쓰일 객체라고 판단하고 Old generation 영역으로 이동하게 된다.

이러한 과정을 반복하여 Old generation의 영역이 가득 차게 되면 이 때 Major GC가 실행된다.

 

GC 동작 방식

Stop The Word

GC를 수행하기 위해 GC를 제외한 모든 스레드는 중지된다.

Mark and Sweep

스레드가 중지된 이 후 특정 시점에 GC Roots로 부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾고 그 객체가 또 어떤 객체를 참고하는지 찾아서 마킹하는 과정을 Mark라 한다. 즉 Reachable 객체를 식별하는 과정을 뜻한다. Sweep은 이러한 과정에서 걸러진 Unreachable 객체의 메모리를 해제하는 것을 말한다.

이때 GC Roots는 stack 영역의 데이터, method 영역의 static 데이터, JNI(네이티브 메소드 인터페이스)에 의해 생성된 객체들을 예시로 들 수 있다.

 

GC의 단점

  1. 가비지 컬렉션이 일어나는 시점이나 점유 시간을 예측하기 힘들다.
  2. 일시적으로 GC를 제외한 다른 스레드들의 동작을 멈추기 때문에 오버헤드를 일으킬 수 있다.

추가

힙 영역에 Eden, Old 영역 이외에 PermGen이라는 메모리 영역이 없어지고 Metaspace 영역이 생겼다.

Perment generation, 클래스 메타데이터를 담는 곳

기본적으로 제한된 크기를 가지고 있어 동적으로 클래스를 생성하는 경우, 매우 큰 프로젝트의 경우 이 메모리 영역이 가득차게 되어 에러가 날 수 있으나 자바 8이후로 Metaspace 영역이 이를 대체하였다.

Heap 영역이 아닌 Native 메모리 영역으로 기본적으로 제한된 크기를 가지지 않고 필요한 만큼 계속 늘어난다.

jstat(jdk 설치 시 기본 제공) 과 같은 프로그램으로 메모리를 모니터링 하여 누수되는 메모리를 찾아내는게 가장 좋다.

 

'IT' 카테고리의 다른 글

Spring Security  (0) 2022.08.09
인터페이스와 추상클래스  (0) 2022.08.09
애자일 방법론  (0) 2022.08.09
웹 동작 원리  (0) 2022.08.09
TCP연결 3,4-way handshake  (0) 2022.08.09