Back-End/Java

[Java] 가비지 컬렉션(Garbage Collection, GC)이란?

zsunny 2023. 12. 12. 22:02

1. 가비지 컬렉션의 개념

- 자바가 실행되는 JVM 에서 사용되는 객체, 즉 Heap 영역의 객체를 관리해 주는 기능을 말한다.
- 유효하지 않은 메모리인 가비지(Garbage)가 발생했을 때, JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해준다.
- 이때, Stop The World와 Mark and Sweep 과정이 일어난다.

 

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

JVM의 Heap 영역은 Young(새로운 객체들이 할당되는 영역)과 Old(Young에서 오래 살아남은 객체들이 존재하는 영역) 2가지 영역으로 나뉘는데, GC가 실행되면 일반적으로 다음과 같은 단계를 따른다.

1. Stop The World

가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈춘다. GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개된다. 이는 성능 저하를 일으키기에 Stop The World 시간을 줄이는 튜닝 작업을 진행하기도 한다.

2. Mark and Sweep

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

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

JVM의 Heap 영역

Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않고, 큰 객체들은 Old 영역에 할당된다.

2-1.  Minor GC (Young 영역에 대한 가비지 컬렉션)의 동작 방식

Young 영역은 1개의 Eden (새로 생성된 객체가 할당 Allocation 되는)영역 + 2개의 Survivor(최소 1번의 GC 이상 살아남은 객체가 존재하는) 영역, 총 3개의 영역으로 구성된다.

새 객체가 생성되면 Young Geceration 영역의 Eden 영역에 할당되고, Eden 영역이 꽉 차 Minor GC가 발생하면 사용되지 않는 메모리는 해제되고 Eden 영역에 존재하는 사용중인 객체는 1개의 Survivor 영역으로 옮겨진다. (이때, 2개의 Survivor영역 중 한 곳에만 데이터가 존재해야 한다.)

이 과정이 반복되다가 Survivor 영역이 꽉 차게 되면 다른 Survivor 영역으로 이동시키고, 기존 Survivor 영역은 비운다.

이 과정이 반복하며 살아남은 객체는 Old 영역으로 이동(Promotion) 된다.

정리

1) 새 객체 생성 시 Eden 영역에 할당

2) Eden 영역이 꽉 차면 Minor GC 실행

    - Eden 영역에서 사용되지 않는 객체의 메모리 해제

    - Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동

3) 1~2 과정 반복하여 사용중인 Survivor 영역이 꽉 차면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시키고 기존 Survivor 영역은 비움

4) 1~3 과정 반복하여 살아남은 객체는 Old 영역으로 이동(Permution)

2-2. Major GC (Old 영역에 대한 가비지 컬렉션)의 동작 방식

객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 Major GC가 발생한다.

Young 영역은 일반적으로 Old 영역보다 크기가 작아 GC가 보통 0.5-1초 사이에 끝나기에 애플리케이션에 크게 영향을 주지 않는다.

하지만, Old 영역은 Young 영역보다 크고 Young 영역을 참조할 수도 있기에 Major GC 는 Minor GC 보다 10배 이상의 시간을 사용한다.

(Young 영역과 Old 영역을 동시에 처리하는 GC를 Full GC 라고 한다.)

 

참고 

- https://mangkyu.tistory.com/118

- https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC