stop-the-world = GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
-GC를 실행하는 쓰레드를 제외한 모든 쓰레드는 멈춤
[GC의 가설]
Weak generational hypothesis - 1. 객체는 금방 접근 불가능 상태, 2. 오래된 객체에서 젋은 객체로의 참조는 드물다
위 가설의 장점을 살리고자 물리적 구조를 Young 영역, Old 영역으로 나뉜다
Young 영역 - 새로 생성된 객체들이 위치하는 곳, Minor GC 발생
Old 영역 - Young 영역에서 살아남은 객체들이 위치하는 곳, Major GC(Full GC) 발생
※ Old 영역의 객체가 Young 영역의 객체를 참조하는 경우
Old 영역에는 카드 테이블이 존재함 -> Young 영역 객체에서 Old 영역 객체를 참조할 시 카드 테이블에 표시됨으로
Young 영역의 GC가 발생할때 Old 영역을 모두 확인할 필요없이 카드 테이블만 뒤져서 GC 대상을 결정할 수 있음.
[Young 영역]
Eden 영역 1개, Survivor 영역 2개
절차) ※Survivor 2 영역 중에 한 곳은 반드시 비어있어야 한다.
1. 생성된 객체는 Enden 영역에 위치
2. Eden 영역에 GC 발생시 살아남은 객체는 Survivor 영역 중 1개로 이동
3. Eden 영역에 GC가 발생하면 살아있는 객체가 존재하는 Survivor 영역에 계속 쌓인다
4. Survivor 영역 1개가 Full 상태가 되면 그중 살아 남은 객체만 2번째 Survivor 영역으로 이동한다. (Full 상태였던 Survivor은 0 상태가 된다.)
5. 이 과정을 반복하다가 살아남은 객체는 Old 영역으로 이동한다.
[Old 영역]
공간에 데이터가 가득차면 GC가 발생한다.
GC 방식에 따라 처리 절차가 달라진다.
[GC 알고리즘]
mark-sweep-compact 알고리즘
- Mark(식별) : Old 영역에 살아 있는 객체를 식별하는것
- Sweep(남기다) : 힙의 앞부분부터 살아있는것만 남긴다.
- Compaction(나누다) : 각 객체들이 연속되게 쌓이도록 힙의 앞부분부터 채워 객체가 있는 부분과 없는 부분을 나눈다.
mark-summary-compaction 알고리즘
[GC 방식]
1. Serial GC - CPU 1개만 있을때 사용하려고 만든 GC 성능 안좋음 (처리 쓰레드 1개)
-> mark-sweep-compact 알고리즘, 싱글 쓰레드
2. Parallel GC - 멀티 쓰레드로 GC를 처리함으로 충분한 메모리, 코어 개수가 많을때 유리
-> mark-sweep-compact 알고리즘, 멀티 쓰레드
3. Paraller Old GC (Parallel Compacting GC)
-> mark-summary-compaction 알고리즘, 멀티 쓰레드
4. Concurrent Mark&Sweep GC(CMS)
다른 쓰레드와 동시에 작업을 수행하는 단계가 많기에 STW 시간이 매우 짧다.
-> Initial Mark -> Concurrent Mark -> Remark -> Concurrent Sweep
Initial Mark : 가장 가까운 객체 중 살아 있는 객체만 찾는 단계
Concurrent Mark : 1단계에서 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인 (다른 쓰레드와 동시에 진행)
Remark : Concurrent Mark 단계에서 새로 추가되거나 끊긴 객체를 확인
Concurrent Sweep : 쓰레기를 정리하는 작업 (다른쓰레드와 동시에 진행)
※단점
메모리와 CPU를 많이 사용함, Compaction 단계를 기본적으로 제공하지 않음
5. G1(Garbage First) GC
바둑판 영역에 객체를 할당하고 GC를 실행한다. 해당 영역이 차면 다른 영역으로 객체를 할당한다.
즉, Old 영역이 존재하지 않음, CMS GC를 대체하기 위해 만들어진 방식임
장점 : 성능 UP (JDK 7부터 정식으로 G1 GC 제공)
'IT > 자바' 카테고리의 다른 글
Chapter2 동작 파라미터화 코드 전달하기 (0) | 2020.08.30 |
---|---|
HashMap의 동작 (0) | 2020.07.23 |
[ORACLE] JOIN _ ON 과 WHERE _ 오라클 조인 (0) | 2020.02.17 |
Java Wapper 클래스 (0) | 2020.01.07 |
JAVA 프로세스 구동시 지연발생 (0) | 2019.12.12 |