# GC
## Garbage Collection(GC) 이란?
- 가비지 컬렉션(Garbage Collection): 가비지 컬렉션은 메모리 관리의 프로세스 또는 메커니즘을 의미합니다.
- 가비지 컬렉터(Garbage Collector): 가비지 컬렉터는 가비지 컬렉션 프로세스를 실제로 구현한 것입니다.
- JVM 메모리상에서 힙영역에 동적으로 할당했던 객체가 더 이상 쓸모가없을때 자동으로 제거한다.
## 가비지 컬렉터 기본 동작방식
1. 힙영역제외한 프로그램이 실행되는 동안 접근 가능한 모든 참조로 구성되는<br> 즉 루트 스페이스부터 시작하여 그래프 순회를 해서 객체에 도달 가능하는 객체만 마킹을한다.
2. 마킹된 객체만 두고 나머지 객체는 제거한다.
3. 제거된 빈 공간에 마킹된 객체를 모아준다.
## GC 동작 과정
``` c
void freeBuffer(TextBuffer *buffer) {
Line *current = buffer->head;
while (current != NULL) {
Line *next = current->next;
free(current);
current = next;
}
free(buffer); -> c언어 메모리 헤제 방식
}
```
- 자바의 Heap 메모리의 원리는 약한 세대 가설(Weak Generational Hypothesis)이다.
- 약한 세대 가설?
- 대부분의 객체는 금방 쓸모없어진다.
- 오래된 객체에서 새 객체로의 참조는 드물다.
- 즉 약한 세대 가설은 root로부터 참조 불가능한 모든 object는 쓰레기로 간주함. 하지만 GC가 수행될때마다 참조하면 부하가 심해져 Heap 메모리를 크게 2가지로 나눴음.
- Heap 메모리의 구성
- Young Generation
- 새로운 객체
- 객체의 생성과 이동을 담당하므로 속도를 중시함
- Minor GC
- Eden, Sur0, Sur1
- Eden: 객체의 생성과 이동을 주로 담당
- 이동? : Sur0, Sur1으로 옮기는 작업
- Sur0, Sur1
- 사실 숫자는 중요하지 않음, 일단 2개 이상이 있다는게 중요
- 작동방식은 A와 B가 있다면 A 대상으로 GC가 작동된다면 B로 살아남은 객체를 옮기고 A에 남은 객체 삭제, B를 삭제한다면 A로 살아남을 객체를 옮기고 B삭제
- Old Generation
- 오랫동안 살아남은 객체
- 객체의 저장 공간과 비슷함, 저장 공간 중요
- Major GC
- Old
- Young 힙에서 오랫동안 살아남은 객체를 저장하는 장소`
`
### Minor GC
- 메모리는 Young Generation, Old Generation 으로 나뉜다.
- 모든 객체는 처음에 Young Generation 영역의 Eden 에 생성된다.
- Young Generation은 Old Generation 보다 상대적으로 작은 공간이기 때문에, 객체를 찾아 제거하는데 시간이 적게 소요된다.
- 따라서 Young Generation 영역에서 GC가 동작되는 것을 Minor GC 라고 한다.
#### Minor GC 동작 방식
- 1. 처음 객체는 `Eden 영역`에 자리가 꽉 찰 때까지 생성된다.
- 2. `Eden 영역`에 적재할 공간이 없으면 Minor GC가 실행된다.
- 3. "접근 가능 객체"에 mark 한다. (mark)
- 4. 살아남은 객체는 Eden에서 survivor 영역(둘 중 하나)으로 이동한다.
- 5. mark가 없는(접근 불가능한) 객체의 메모리를 해제한다.(sweep)
- 6. 살아남은 객체의 age 값이 1씩 증가한다. (살아남은 횟수 1씩 증가)
- age 값이 임계값에 다다르면 Promotion(Old Generation 영역) 여부 결정
- JVM 중 일반적인 HotSpot JVM은 age의 기본 임계값이 31이다.
- survivor 영역 중 하나는 반드시 사용되어야 하고, 나머지는 비어있어야 한다. 만약 이 조건에 해당하지 않으면 현재 시스템이 비정상이라는 뜻이다.
- 7. 다시 Eden에 객체가 꽉 찰 때까지 생성된다.
- 8. 사용 중인 survival 0 영역까지 찾으며 Mark를 수행한다.
- 9. marking 된 객체들은 비어있는 survival 1 영역으로 이동시킨다.
- 10. 접근 불가 객체는 sweep 된다.
- 11. 살아남은 모든 객체들은 age가 1씩 증가한다.
### Major GC
- Old Generation 영역은 오래 살아남은 메모리들이 존재하는 영역이다.
- 반복되는 Minor GC 로부터 살아남아 age 값이 임계값에 도달하면 Old Generation 에 이동된다.
- 객체들이 Promotion 되어 Old Generation 영역의 공간이 부족해지면 Major GC 가 동작한다.
- Major GC 는 상대적으로 큰 Old Generation 영역 탓에 객체 제거에 상대적으로 오랜 시간이 소요된다. (보통 10배 이상)
- Major GC도 mark & sweep 방식으로 동작한다. 필요하면 메모리 조각 모음(Compact)을 수행해서 메모리 할당과 해제의 효율을 향상 시킨다.
## GC 알고리즘 종류
- Serial GC
- CPU가 1개 일 때를 위한 가장 간단한 GC
- Parallel GC
- Java 8의 디폴트 GC
- minor GC는 멀티 스레드, major 영역은 싱글 스레드
- GC 스레드는 기본적으로 cpu 개수만큼 할당
- Parallel Old GC
- young, old 영역을 모두 멀티 스레드로 GC 수행
- CMS GC (Concurrent Mark Sweep)
- 어플리케이션 스레드와 GC 스레드를 동시에 실행해 stop the world 시간을 최소화
- GC 과정이 복잡해짐
- MS GC는 Java9 버젼부터 deprecated 되었고 결국 Java14에서는 사용이 중지
- G1 GC (Garbage First)
- Java 9+ 버전의 디폴트 GC로 지정
- 전체 Heap 영역을 **Region**이라는 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 등 역할을 **고정이 아닌 동적으로 부여**
- Garbage로 가득찬 영역을 빠르게 회수하여 빈 공간을 확보하므로, 결국 GC 빈도가 줄어드는 효과를 얻게 되는 원리
- 메모리를 일일히 탐색하는 것이 아니라 메모리가 많이 차 있는 region을 인식해 우선적으로 GC 한다.
## Stop-the-world ?
- "Stop-the-world"는 가비지 컬렉션(Garbage Collection) 프로세스 중에 발생하는 현상을 지칭합니다. 이는 일반적으로 메모리 관리 작업을 위해 JVM(Java Virtual Machine)이 애플리케이션 실행을 잠시 멈추는 현상을 의미합니다.
- Stop-the-world 현상은 다음과 같은 상황에서 발생합니다:
- 가비지 컬렉션 실행: Major GC 또는 Full GC와 같은 가비지 컬렉션 프로세스가 실행될 때, JVM은 힙(heap) 영역을 정리하기 위해 애플리케이션의 실행을 일시적으로 중단합니다. 이는 모든 애플리케이션 스레드가 멈추고 가비지 컬렉션 작업이 수행되는 동안 메모리 상태를 조사하고 업데이트하기 위해 필요합니다.
- 메모리 할당 실패: 힙 영역이 가득 차거나 메모리 할당 실패가 발생할 때도 Stop-the-world 현상이 발생할 수 있습니다. 이러한 경우에도 애플리케이션 실행이 일시적으로 멈추고 가비지 컬렉션 또는 메모리 정리 작업이 수행됩니다.
- Stop-the-world 현상은 일시적으로 애플리케이션의 응답성을 감소시킬 수 있으며, 대규모 메모리 관리 작업이 발생할 때에는 애플리케이션의 성능에 영향을 줄 수 있습니다. 따라서 Stop-the-world 현상이 발생하는 빈도와 지속 시간을 최소화하기 위해 가비지 컬렉션 튜닝 및 메모리 관리를 신중하게 고려해야 합니다.
- 참고자료
- [가비지 컬렉션 동작 원리 & GC 종류 💯 총정리](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#minor_gc_%EA%B3%BC%EC%A0%95)