주제내용Garbage Collector 후아유🗻 Garbage CollectionGarbage Collection은 ?🛬 Stop the world🚩 HEAP 메모리🚢 GC의 종류마이너 GC메이저 GC🤸♂️ 객체 GC 과정1. 객체가 생성 되어 Eden 영역에 올라간다.2. Servivor 영역으로2-1. Servivor 영역보다 큰 객체라면 ?3. 오랫동안 살아 남으면 Old 영역으로 이동🚛 GC의 종류 (feat.애플리케이션에서 사용가능한)Serial GCParallel GCParallel Old GCConcurrent Mark Sweep CollectorG1 GCReference
주제
gc란
내용
Garbage Collector 후아유

- 더이상 사용하지 않는 메모리 영역을 자동으로 회수해준다. -> Garbage Collection
- 이 아이가 있어 java는 **managed language **
- Like 청소를 못하는 주방장의 조리대를 치워주는 똑똑한 조수 요기
🗻 Garbage Collection
Garbage Collection은 ?
- 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 사용하지 않게된 메모리 영역을 자동으로 회수하는 기능
- 장점
- 개발자가 메모리 할당 및 할당 해제에 대해 걱정하지 않아도 된다.
- 이미 해제된 메모리에 접근하거나 다시 해제를 하는 버그를 줄일 수 있다.
- 메모리 누수 멈춰 !
- 단점
- 해제할 메모리를 결정하는데 사용하는 알고리즘에 의해 비용이 든다
- GC가 언제 일어날지 예측하기 어렵다 ! -> System.gc 를 사용해도 바로 실행되는 것이 아님 사용하면 안 됨
🛬 Stop the world
- GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
- GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈추고, **GC 작업을 완료한 이후에야 작업을 다시 시작한다. **
🚩 HEAP 메모리

- Young - 모든 새로운 객체가 할당되는 곳, 마이너 GC
- eden : 초기에 메모리가 할당되는 곳
- survivor : eden에서 Galbage Collection에 살아남은 개체
- Old - 일정 시간 동안 존재했던 객체 (많이 살아 남았다)
- 메이저 GC
- Permanent - 클래스의 메타데이터, 메서드의 메타데이터, 상수풀, static 변수 등 JVM의 반영 데이터를 포함하는 풀, 객체가 영원히 남아있는 곳이 아님 => 자바 8 에서 사라지고 Native Memory 영역에 metaspace가 추가됨 관련 내용
🚢 GC의 종류
마이너 GC
- Young Generation 영역의 객체중 미사용으로 판단되는 객체 GC
메이저 GC
- Old 영역으로 옮겨진 객체중 미사용으로 판단되는 객체 GC
- Old는 메모리 할당률이 낮기 때문에 GC가 일어나는 빈도가 적다
- Young에 비해 용량이 크고 객체 수도 많아 Stop the World 시간이 길다.
🤸♂️ 객체 GC 과정
1. 객체가 생성 되어 Eden 영역에 올라간다.

- 이후 Eden 영역이 가득차면 마이너 GC가 발생한다.
- 할당이 해제되지 않은 객체를 Servivor1 영역으로 이동
2. Servivor 영역으로

- Survivor1 영역이 또 가득차면 GC 심사를 받고 살아남으면 Servivor2 영역으로 이동
- Servivor2가 가득차면 GC 심사 후 Old로 이동
- Servivor 영역중 하나는 반드시 비어있어야한다. -> 두 영역에 모두 데이터가 존재하거나 사용량이 0이라면 비정상
2-1. Servivor 영역보다 큰 객체라면 ?

3. 오랫동안 살아 남으면 Old 영역으로 이동

🚛 GC의 종류 (feat.애플리케이션에서 사용가능한)
Serial GC
- CPU 성능이 낮을 때 유용하고 하나의 스레드만 사용
- 마이너 GC : mark-sweep-compact
- 메이저 GC : mark-sweep-compact
- 살아있는 객체를 식별하고(Mark), Old영역의 가장 앞부분 부터 살아 있는 것만 남기고 삭제하며(Sweep), 마지막으로 살아있는 객체들을 가장 앞쪽으로 모아준다.(Compact)
- 느리다. 자원이 부족할 때 사용
Parallel GC
- 시스템에 있는 CPU 코어의 수 만큼 스레드를 만들어 마이너 GC에 이용하는 것을 제외하고 Serial과 동일 -> 메이저 GC에서는 한 개의 스레드만 사용
- 마이너 GC : Parallel Scavenge
- 메이저 GC : Serial Mark-Sweep-Compact
Parallel Old GC
- 메이저와 마이너에서 모두 여러 개의 스레드를 사용하는 것을 제외하고 Parallel GC 동일
Concurrent Mark Sweep Collector
- GC 작업과 애플리케이션이 사용하는 스레드를 동시에 수행하여 STW에 의한 애플리케이션 중지 상태를 최소화한다.
- 마이너 GC 영역에서는 Parallel GC 와 같은 알고리즘을사용
- STW 에 의해 일어나는 일시정지를 포함한 평균 응답 시간을 줄일때 사용
- 마이너 GC : Parallel Scavenge
- 메이저 GC : Concurrent Mark-Sweep
G1 GC
- CMS collector를 대체하는 것이 목표
- 병렬성, 동시성, 적은 STW를 가짐
- Young 영역과 Old 영역이 없고 힙 공간을 여러 개의 동일한 사이즈의 힙 공간을 분리함 -> 이 공간을 region이라 부름
- GC가 호출되면 refion 중에 liveness가 가장 적은 곳이 GC 됨