티스토리 뷰
GC(Garbage Collector)란?
- JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스
GC의 수거 대상
- 어떤 객체의 유효한 참조가 존재한다면 Reachable, 그렇지 않다면 Unreachable이라고 한다.
GC의 동작 순서
- Mark and Sweep 알고리즘을 따른다.
- Mark는 Reachable 객체와 Unreachable 객체를 식별하여 마킹한다.
- Sweep은 Unreachable한 객체들을 Heap에서 제거한다.
- GC 알고리즘에 따라 Compact 과정이 추가되기도 한다. Compact는 Sweep 후에 분산된 객체들을 한 곳으로 모아서 메모리 단편화를 막아준다.
GC는 언제 일어날까
- Heap의 구조는 Young Generation, Old Generation으로 구분된다.
- Young Generation은 새로운 객체들이 할당되는 영역
- Old Generation은 Young Generation에서 오랫동안 살아남은 객체들이 존재하는 영역
- 새로운 객체들이 eden 영역이 할당이 되고 더이상 할당할 수 없을 경우 Minor GC가 발생한다.
- Mark and Sweep 알고리즘에 따라 Reachable 객체와 Unreachable 객체를 식별한다.(Mark)
- eden 영역의 Unreachable 객체는 제거된다.(Sweep)
- Reachable 객체는 Survivor 영역으로 이동하고 Age 값이 증가한다. 이때 Survivor 영역은 둘 중 한 곳에 객체가 저장되면 나머지 한 곳은 반드시 비어 있는 상태여야 한다.
- Minor GC가 발생할 때마다 Survivor 영역이 바뀐다.
- 위과 같은 Minor GC 과정이 반복되면서 Age 값이 특정 임계점에 도달한 객체는 Old Generation 영역으로 이동한다.
- Old Generation 영역이 가득 차면 Major GC(또는 Full GC)가 발생한다.
Stop-the-World
- GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
GC의 종류
GC | 설명 |
Serial GC | - GC를 처리하는 쓰레드가 1개 - 다른 GC에 비해 Stop-the-World 시간이 길다. - Mark-Compact(Sweep 포함) 알고리즘 사용 |
Parallel GC | - Java 8의 default GC - Young Generation의 GC를 멀티 쓰레드로 수행 - Serial GC에 비해 Stop-the-World 시간이 짧다. |
Parallel Old GC | - Parallel GC를 개선 - Old 영역에서도 멀티 쓰레드 방식의 GC 수행 - Mark-Summary-Compact 알고리즘 사용(summary: 멀티쓰레드가 old영역을 분리해서 훑는다.) |
CMS(Concurrent Mark Sweep) GC | - Stop-the-World 시간을 줄이기 위해 고안됨 - Reachable 객체를 한번에 찾지 않고 순차적으로 찾는 것이 특징이다. - compact 과정이 없음(메모리 단편화 문제 발생) |
G1(Garbage First) GC | - CMS GC의 메모리 단편화 문제를 개선 - Java 9+의 default GC - Heap을 일정한 크기의 Region으로 나눔 - 전체 Heap이 아닌 Region 단위로 탐색 - compact 진행 |
참고
www.youtube.com/watch?v=vZRmCbl871I&list=TLPQMDgwNDIwMjFUy2LZh_aEhA&index=2
www.youtube.com/watch?v=Fe3TVCEJhzo&list=TLPQMDgwNDIwMjFUy2LZh_aEhA&index=3
www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
'Language > Java' 카테고리의 다른 글
자바 자료구조 (0) | 2022.07.04 |
---|---|
Overflow가 발생하면 어떻게 될까? (0) | 2022.04.27 |
Java Virtual Machine 구조 (0) | 2021.04.09 |
10진수 <-> 2, 8, 16진수 변환 (0) | 2021.02.28 |
데이터 타입별 형변환 방법 (0) | 2021.02.22 |