# Garbage Collection 원리

### 1. 가비지 컬렉션 개요

자동 가비지 컬렉션(Automatic garbage collection)은 메모리의 **힙** 영역을 살펴보고 **사용하지 않는 객체를 삭제**하는 프로세스이다.<br>

* 사용 중인(참조되는) 객체: 프로그램의 일부가 객체에 대한 포인터를 유지함
* 사용하지 않는(참조되지 않는) 객체: 더 이상 어떤 부분에서도 참조되지 않음

<br>

#### 1.1. 마킹

1 단계로 마킹(Marking) 작업을 진행한다. 마킹이란 GC(Garbage Collector, 이하 GC)가 사용되는 메모리와 그렇지 않은 메모리를 구분하는 걸 말한다.<br>

![png](https://979546957-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXToj3GG8hYUuKGTWqvUm%2Fuploads%2Fgit-blob-362603a7cf2c358caf019c8b49584938256dad67%2F8-1.png?alt=media)

편의상 참조되는 객체는 푸른색, 참조되지 않는 객체는 회색으로 표시했다. GC는 마킹 단계에서 참조되는 객체와 참조되지 않는 객체에 대한 결정을 내리기 위해 모든 객체를 스캔한다. 만일 시스템의 모든 객체를 스캔해야 하는 경우 이 작업에 많은 시간이 소모된다.<br>

<br>

#### 1.2. 일반 삭제

2 단계로 일반 삭제(Normal Deletion) 작업을 진행한다. 일반 삭제란 참조되지 않는 객체를 제거하는 걸 말한다.<br>

![png](https://979546957-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXToj3GG8hYUuKGTWqvUm%2Fuploads%2Fgit-blob-a92e6217a7e2747a4f72cf58e4ee721bb5bc1e73%2F8-2.png?alt=media)

메모리 할당자(Memory Allocator)는 새 객체를 할당할 수 있는 여유 공간 블록에 대한 참조를 보유한다.<br>

<br>

#### 1.3. 압축 삭제

2단계에서 압축 삭제 작업을 진행할 수 있다. 압축 삭제란 성능을 더욱 향상시키기 위해 참조되지 않는 객체를 삭제하면서 남은 빈 공간을 압축하는 걸 말한다.<br>

![png](https://979546957-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXToj3GG8hYUuKGTWqvUm%2Fuploads%2Fgit-blob-3d89e0fffc7635c34dc47969e0f0b0725e81550d%2F8-3.png?alt=media)

참조된 객체를 함께 이동했기 때문에 필요한 경우 메모리를 훨씬 쉽게 할당할 수 있다.<br>

<br>

#### 1.4. 가비지 컬렉션에 세대가 필요한 이유?

앞서 설명했듯이 JVM에서 모든 객체를 마킹하고 삭제하는 건 많은 시간을 소모하므로 비효율적이다.<br>

![png](https://979546957-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXToj3GG8hYUuKGTWqvUm%2Fuploads%2Fgit-blob-cd0a37fd8b572ad54dff79c31ba4a9cb38ce4062%2F8-4.png?alt=media)

애플리케이션에 대한 경험적 분석에 따르면(오라클 공식 문서 참고) 대부분의 객체는 수명이 짧다. 따라서 애플리케이션의 세대를 나누면 효율적으로 관리할 수 있다.<br>

<br>

#### 1.5. 힙 메모리 구조

![png](https://979546957-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXToj3GG8hYUuKGTWqvUm%2Fuploads%2Fgit-blob-e76c6ff90376b69d19e8878992c63461df5f226f%2F8-5.png?alt=media)

힙 메모리는 내부적으로 Young Generation, Old Generation으로 나누어 객체를 관리한다.<br>

Stop The World

STW(Stop The World)는 JVM이 GC를 실행하는 동안 모든 애플리케이션 스레드를 중단하는 현상을 말한다.

\ <br>

### 2. 일반적인 가비지 컬렉션 프로세스

![gif](https://979546957-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXToj3GG8hYUuKGTWqvUm%2Fuploads%2Fgit-blob-79b120f8f5ca20722742a68d0887ae9b1aab2166%2F8-6.gif?alt=media)

1. 새로운 객체가 eden 공간에 할당된다. 두 개의 Survivor space는 비어있다고 가정한다.
2. eden 공간이 꽉 차면 Minor Garbage Collection이 발생한다.
3. 참조된 객체는 S0로 이동한다. 참조되지 않은 객체는 eden 공간이 지워질 때 삭제된다.
4. 다음 Minor GC에서 참조된 S0의 객체가 S1로 이동한다. S0와 eden 공간은 지워진다.
5. 다음 Minor GC에서 참조된 객체는 S0로 이동한다. eden과 S1 공간은 지워진다.
6. S0과 S1을 오가며 참조된 객체가 특정 임계값에 도달하면 Tenured로 승격한다.
7. Tenured 공간이 꽉 차면 Major Garbage Collection이 발생한다.

참고 자료

* <https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html>
