공부 시간 : 2021/05/02 16:40 ~ 18:30
8주차. gc종류별 차이점
Java 7,8 에서는 기본적으로 Parallel gc를 사용하며, Java 9~12에서는 G1 gc를 사용한다. Java 11에서는 z GC를 시범적으로 사용하고 있다고 한다.
각각 gc의 하나하나 동작원리를 살펴보기 보다는 어떠한 장점이 있고 버전이 올라가게 되면서 gc 종류를 바꾼 이유를 중점으로 알아보려고 한다.
Serial GC
이름에서도 알 수 있듯이, 순차적인, 직렬로 실행되어 Mark-Sweep이 한번에 하나씩만 실행된다. 가장 오래된 GC 종류이며 최근에는 사용되지 않는다. 그 이유는 stop-the-world가 빈번하게 발생하기
때문이다. 서버의 cpu코어가 1개일 경우를 생각하고 개발되었다고 한다.
Parallel GC
Serial GC를 쓰레드마다 Mark-Sweep을 수행하여 병렬로 실행하게 된다. 병렬로 실행하기 때문에, serial gc에 비하여 stop-the-world가 발생하는 시간이 줄어들게 된다. Serial gc가
cpu코어 하나를 생각하고 만든 것이라면, parallel gc는 멀티쓰레드 머신에서를 생각하고 개발되었기 때문에, gc를 수행할 쓰레드의 갯수도 설정을 할 수 있다. serial gc에 비하여
stop-the-world 시간이 줄어든 것은 맞지만, 더 나은 개선을 한 알고리즘들이 있어, 최신 자바에서는 다른 gc방식을 이용한다.
CMS(Concurrent Mark Sweep) GC
CMS gc에서도 parallel gc와 마찬가지로 멀티쓰레드를 활용한다. parallel gc와 차이점은 Mark-Sweep 알고리즘을 Concurrent하게 수행한다는 점이다. stop-the-world 시간을
최소화하기 위한 목적으로 설계가 되어, gc가 작동 중 일때도 지연시간이 짧다는 장점이 있다. 실시간 데이터처리, 즉 레이턴시에 민감한 경우에 적합한 gc라고 볼 수 있다. parallel gc와 비교하여 장점만
있는 것은 아니다.
- gc 풀 사이클이 더 길다.
- gc가 실행되는 중에 어플리케이션 스레드의 절반은 gc에서 사용하기때문에 처리속도 지연이 발생한다.
- mark sweep 알고리즘이 더 복잡하기 때문에 cpu, 메모리 사용량이 많다.
- Old Generation 메모리를 Compaction하는 단계를 거치지 않아 메모리 단편화가 발생 할 수 있다.
CMS GC를 기본gc로 채택한 버전은 없는데, 찾아보니 deprecated 되었다고 한다. 그 이유는 다른 gc알고리즘에 비하여 대용량처리에 사용되는 자원이 너무 많기 때문이라고 한다. parallel에 비해 약
12배, g1에 비해 약 3배, z에 비해 약 9배의 자원을 더 많이 사용한다.
G1 GC
자바6부터 실험적으로 도입되었다가 자바 9부터 기본 GC로 채택되었다.(자바12에서도 기본 GC)
g1 gc는 cms gc를 대체할 목적으로 설계되었기에, cms gc의 장점인 짧은 중단시간과 함께, compaction단계를 거치게되어 메모리 단편화가 발생하지 않고, stw 시간을 예측 할 수 있다.
heap 용량이 커지게되면 당연히 gc가 처리해야할 객체수가 많아지고 stw 시간도 늘어나게 될텐데, 이전의 parallel, cms gc에 비해 g1 gc는 매우 빠르게 대용량 heap에 대해서도 gc를 수행할 수 있다. 그 이유는 다음과 같다.
- 모든 Heap 영역에 대해서 gc를 수행하지 않고, 영역을 나누어 gc가 필요한 영역만 gc를 수행한다.
- Old generation을 compaction하는데도, 전체를 다 하지 않고 1번과 같이 필요한 영역에서만 compation을 수행한다.
- 영역을 나누고, 해당 영역의 객체들이 모두 마킹되었다면, 그 영역을 빈공간으로 만들어 메모리를 회수한다. 여유공간이 빨리 빨리 확보되기 때문에 gc빈도도 줄어들게 되고 stop-the-world 시간도 줄어드는 장점이 있다.
Z GC
비교적 최근에 나온 gc이며, z gc 설계 목표는 아래 3가지 이다.
- stop the world로 인한 지연시간이 10ms를 초과하지 않음.
- Heap 사이즈가 커지더라도 stop the world 시간이 증가하지 않음.
- 8MB ~ 16TB에 이르는 다양한 Heap 사이즈를 처리 할 수 있음.
Z gc는 g1 gc에서 region(영역)과 비슷한 개념인 ZPages를 사용하는데, region의 크기가 고정적이 였다는데 비하면 ZPages는 2MB의 배수로 동적으로 생성, 삭제될 수 있다.
- z gc의 heap은 다양한 크기의 zPages를 포함한다.
- Z gc가 compaction 단계를 거치면 Zpage는 Zpagecache에 캐싱된다.
- 캐싱된 zpage는 새로운 heap 할당을 하는 과정에서 재사용된다.
- 메모리를 commit하고 삭제하는 것은 비싼작업이기 때문에 캐싱하는 것이 성능에 많은 영향을 준다.
참고 사이트 :
'컴퓨터 > JAVA' 카테고리의 다른 글
자바 고급 스터디 10. 인터페이스, 추상클래스, Enum (0) | 2021.05.15 |
---|---|
자바 고급 스터디 9. static에 대하여 (0) | 2021.05.09 |
자바 고급 스터디 7. garbage collector (0) | 2021.04.23 |
자바 고급 스터디 6. 리플렉션 (reflextion) (0) | 2021.04.14 |
자바 고급 스터디 5. generic type erasure(제네릭 타입 소거) (1) | 2021.04.07 |