이번 포스팅에서는 GC방식에 대해 써보려 한다.
1.Serial GC
2.Parallel GC
3.Old Parallel GC (Parallel Compacting GC)
4.Concurrent Mark-Sweep GC (CMS)
5.Garbage First GC (G1)
6.Z GC
포스팅 일자 기준으로 이렇게 6가지 방식이 존재한다.
1.Serial GC
Mark-Sweep-Compact 알고리즘을 사용
말 그대로
- 1. Old 영역에 살아있는 객체들을 식별(mark)하고
- 2.Heap앞부분부터 확인하여 참조되지 않는 객체를 식별한다.(sweep)
- 3. 필요 없는 객체를 지우고 살아남은 객체를 연속적으로 힙을 채워
힙에 객체가 존재하는 부분과 존재하지 않는 부분으로 나눈다.(compaction)
순으로 진행된다.
단일 CPU에 사용하기 위한 방식으로, 적은 메모리 + 적은 코어에 적합한 방식
2.Parallel GC
Serial Gc와 알고리즘은 같으나 멀티 스레드를 사용한다.
다른 CPU가 대기상태로 남아있는 것을 최소화 하는 방식이다.
따라서 CPU사용이 많아 큰 메모리와 다중 코어를 가진 환경에서 유리하다.
3.Old Parallel GC (Parallel Compacting GC)
Mark-Sweep-Compact 가 아니라
Mark-Summary-Compact 알고리즘으로 동작한다.
- 1. Old 영역에 살아있는 객체들을 식별(mark)하고
- 2.이전 GC수행 후 Compaction 된 영역을 확인하여 참조되지 않는 객체를 식별한다.(sweep)
- 3. 필요 없는 객체를 지우고 살아남은 객체를 연속적으로 힙을 채워
힙에 객체가 존재하는 부분과 존재하지 않는 부분으로 나눈다.(compaction)
4.Concurrent Mark-Sweep GC (CMS)
위의 방식들보다 좀 더 복잡하다

방법은
1. Initial mark단계에서 클래스 로더와 가까운 객체 중 살아있는 객체만 확인 => mark 한다
이 단계에서 Stop the world가 발생하긴 하지만, 모든 객체를 확인하는 건 아니기 때문에 멈추는 시간은 적다
2. Concurrent Mark 단계에서는 1번에서 찾은 객체들이 참조하고 있는 객체를 찾아가면서 살아있는 객체를 확인한다 => 2차 mark
3. Remark 단계에서는 2번 단계에서 새로 참조되거나 참조가 끊긴 객체를 확인한다.
4. 마지막 Concurrent Sweep 단계에서는 참조가 되지 않는 객체들을 정리한다.
Stop the world가 발생하는 단계 => 1,3번
우선 장점은
위 그림에서 확인할 수 있듯이 Stop the world pause가 짧다는 것이고
단점은 계속 객체를 확인해야 하기 때문에 메모리와 CPU가 많이 필요하다는 것과
Compact단계가 없기 때문에 조각난 메모리를 Compact 해야 할 경우 Stop the world pause가 길어질 수 있다는 것이다.
5.Garbage First GC (G1)

위 방식들과 가장 다른 점이라고 하면 Young과 Old 영역이 물리적으로 나뉘어 있지 않고, 각 크기가 모두 동일하다는 것이다.
4번 방식을 대체하기 나왔으며 JDK6에서 소개됐으며 현재는 GC 기본값이다.
장점으로는 각 영역의 크기가 정해져 있는 게 아니기 때문에
메모리 사용에 대한 유연성을 가질 수 있다.
방식은 CMS랑 비슷한데, GC가 시작되면 객체가 살아있는지 동시적 + 전역적인 마킹을 수행하고
마킹이 끝나면 가장 많이 비어있는 공간부터 메모리 회수를 시작한다.
6. Z GC
JAVA 11부터 시험 도입되었다.
ZGC의 목표는 G1보다 짧은 latency를 가지며 G1보다 크게 뒤지지 않는 처리량을 갖는 것이다.
ZGC는 모든 종류의 작업을 동시에 작업하며 애플리케이션의 스레드의 실행을 중지하지 않는다는 장점이 있다.
매우 짧은 대기시간이 필요하거나, 테라 바이트 규모의 매우 큰 heap을 사용하는 애플리케이션을 위한 GC방식이다.
Shenandoah gc라는 게 또 있는 거 같긴 한데 다음에 추가로 작성하는 걸로..
참고하면 좋을 내용
각 버전별 GC 기본 설정
- JAVA 8 => Parallel Collector
- JAVA 9-12 => G1 Collector
Full GC 호출
- System.GC()
- 함부로 쓰지 말 것
Full GC와 Major GC 차이점
- 대상 Full : Old + Young
Major : Old
'PROGRAMMING > JAVA' 카테고리의 다른 글
| [JAVA] Map : getOrDefault (0) | 2021.05.05 |
|---|---|
| [JAVA] 출력시 소수점 자리 고정 후 0으로 채우기 (0) | 2021.04.14 |
| [JAVA] GC(Garbage Collection) 이란? (1/2) (0) | 2021.04.04 |
| [JAVA] 자바/JVM 메모리 구조 (0) | 2021.04.03 |
| [JAVA] equals 와 == 비교 (0) | 2021.03.12 |