Web/Java

GC (Garbage Collector)

돌건 2021. 9. 5. 17:36

지난 시간에는 간략하게나마 JVM의 구성과 동작원리에 대해서 알아보았다. 오늘은 JVM의 구성 중 하나인 GC, 가비지 콜렉터에 대해서 알아보자.

 

Garbage Collector

직역해보자면, 쓰레기를 모으는 친구이다.

1. 뭐하는 친구인가?
가비지 콜렉터는 Heap 영역에서 활동하는 친구이다. 지난 시간에 알아봤듯이, Heap 영역에는 배열과 new 연산자를 통해 생성되는 객체들이 적재되는 메모리 공간이다. 그렇다. 가비지 콜렉터는 이 친구들 중에서 쓰레기가 되는 친구들을 제거하는 역할을 하는 것이다. 

2. 그렇다면, 어떤 객체들이 쓰레기가 되는 것일까?
메모리 공간은 한정적이다. 오랜 기간동안 사용되지 않는 객체 친구들은 메모리 공간을 차지하기만 할뿐 프로그램을 실행하는 데 있어 큰 역할을 하지 못한다. 즉, 이런 객체 친구들이 쓰레기가 된다고 볼 수 있다.

3. 어떤 경우에 쓰레기가 되는 것일까?
사용이 되지 않는다는 얘기는 프로그램 어디에선가 그 객체를 호출하거나 참조하지 않는다는 것을 말한다. 이런 경우, 해당 객체가 쓰레기가 된다고 보면 된다.

4. 왜 쓰레기를 제거하는 것일까?
앞서 말했듯이 메모리 공간은 한정적이다. 이 공간을 효율적으로 사용하기 위해서는 무의미하게 공간만 차지하는 친구들은 사라져주는 것이 좋기 때문이다.

GC 용어

[사진 1. Heap 영역 구조 / 출처: https://bscnote.tistory.com/96]

0. Stop the world

각 GC가 실행될 때, GC가 실행되는 스레드를 제외한 나머지 스레드들은 실행을 중단하게 된다. 이러한 현상을 Stop the world라고 말한다.

1. Minor GC

객체가 새로 생성되면 위치하는 공간이 바로 eden이다. 이 공간이 꽉 차게 되면 발생하는 GC를 Minor GC라고 한다. 이 과정을 거치게 되면, 살아남은 객체들이 Survivor 영역으로 이동하게 된다. 또한, Minor GC가 발생하게 되면 Survivor1, 2 영역에 위치한 객체들 중 살아남은 객체들은 Survivor2, 1로 이동하게 된다.

2. Promotion

Minor GC를 통해서 살아남게 되는 객체들은 age라는 살아남은 횟수를 나타내는 정보를 지닌다. 이 age가 특정 값에 도달하면 해당 객체는 Old 영역으로 이동하게 되는데, 이를 Promotion이라고 한다. 

* Survivor 영역보다 큰 객체는 바로 Old 영역으로 이동하는 경우도 있다.

3. Major GC

Old 영역이 꽉 차게 되면 실행되는 GC가 Major GC이다. Old 영역에서 쓰레기 친구들을 제거한다.

4. Mark

접근 가능한 객체를 마킹하는 것을 말한다.

5. Sweep

Mark되지 않은 객체들을 제거하는 과정을 말한다.

6. Compaction

Sweep을 진행하게 되면 메모리에 단편화가 발생하게 되어 메모리에 빈자리가 생기게 되는데, 이를 채워주는 과정을 말한다.

GC 종류

1. Serial GC (-XX:+UserSerialGC)

1. 가장 단순한 방식으로, Single Thread로 동작한다.
2. 싱글 스레드로 동작하기 때문에 그만큼 Stop the world 시간이 가장 길다.
3. Mark - Sweep - Compaction 알고리즘을 사용한다.

2. Parallel GC (-XX:+UserParalleGC)

1. Young 영역에 대해 멀티스레드로 동작하는 GC이다.
2. 따라서 Serial GC에 비해 Stop the world 시간이 적게 걸린다.
3. Java8 의 기본 GC이다.

[사진 2. Serial GC, Parallel GC / 출처: https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html]

3. Parallel Old GC (-XX:+UseParallelOldGC, -XX:+ParallelGCThreads=n)

1. Young 영역뿐만 아니라 Old 영역에서도 멀티 스레드로 동작하는 GC이다.
2. 멀티 스레드의 개수를 지정할 수 있다.
3. Mark - Summary - Compact 알고리즘이 적용된다. 

* Summary 단계에서는 이미 GC가 수행된 영역에서 살아있는 객체를 식별하는 작업을 진행한다.

4. CMS GC (Concurrent Mask Sweep GC)

Reachable한 객체를 찾는 과정이 4단계로 이루어진 GC이다. 

1. Initial Mark - GC Root가 참조하는 객체만 마킹한다. STW 발생 O
2. Concurrent Mark (CM) - 참조하는 객체를 따라가며 마킹한다. STW 발생 X
3. Remark - CM 과정에서 변경 사항이 없는지 확인하여 확정하는 과정이다. STW 발생 O
4. Concurrent Sweep - 접근할 수 없는(Unreachable)한 객체를 제거하는 과정이다. - STW 발생 X

[사진 3. CMS GC / 출처: https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html]

5. G1 GC (Garbage First GC, -XX:+UseG1GC)

1. 기존 GC들과는 다르게 Heap 메모리 영역을 Region이라는 범위로 나누어 관리한다.
2. Heap 영역 전체에 대한 GC를 진행하는 것이 아니라, Region별로 탐색하고 GC를 진행한다.
3. STW 시간이 가장 짧다.

[사진 4. G1 GC / 출처: https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html]

 

참고

JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC )
Java 의 GC는 어떻게 동작하나?