티스토리 뷰
지난 포스팅에 GC(Garbage Collection) 기본에 대해 알아보았다. GC는 크게 Minor GC, Major GC 두 가지 타입으로 나눈다. 이 두 가지 GC가 어떻게 상호 작용하느냐에 따라서 GC 방식에 차이가 나며, 성능에도 영향을 준다.
GC 방식
WAS나 자바 애플리케이션 수행 시 옵션을 지정하여 선택할 수 있으며, GC 방식에 따라 처리 절차가 달라지므로 어떤 GC 방식이 있는지 살펴보자. 우선 JDK7을 기준으로 5가지 방식이 있다. 여기 명시된 다섯 가지의 GC 방식은 WAS나 자바 애플리케이션 수행 시 옵션을 지정하여 선택할 수 있다.
- Serial GC
- Parallel GC
- Paralled Old GC(Paralled Compaction GC)
- Concurrent Mark-Sweep GC(CMS GC)
- G1 GC(Garbage First GC)
mark-sweep-compact 알고리즘
- Old 영역으로 이동된 객체들 중 살아있는 객체를 식별한다.(Mark)
- Old 영역의 객체에서 참조되지 않는 객체를 식별한다.(Sweep)
- 필요 없는 객체를 지우고 살아 있는 객체를 한 곳으로 모은다.(Compact)
mark-summary-compact 알고리즘
- Old 영역으로 이동된 객체들 중 살아있는 객체를 식별한다.(Mark)
- 전에 GC를 수행하여 Compaction 된 영역에 살아 있는 격체의 위치를 조사한다.(Summary)
- Compaction 수행 이후에는 Compaction 영역과 비어있는 영역으로 나눈다.(Compact)
1. Serial GC
- Young 영역과 Old 영역이 직렬로 처리되며 단일 CPU를 사용한다.
- Serial GC는 하나의 CPU를 사용할 때 사용하기 위해 만든 방식으로 애플리케이션 성능이 많이 떨어진다.
- 단일 CPU에 메모리가 적고 대기시간이 많아도 크게 문제 되지 않는 시스템에서 사용한다.
- mark-sweep-compact 알고리즘을 사용한다.
- -XX:+UseSerialGC
2. Parallel GC
- Parallel GC는 Serial GC와 기본적인 흐름은 같다. 다른 점은 Serial GC는 스레드 하나, Parallel GC는 여러 개의 스레드를 사용한다.
- 다른 CPU가 대기 상태로 남아 있는 것을 최소화하는 방식으로, Serial GC와 달리 Young 영역에서 병렬로 처리한다.
- 많은 CPU를 사용하기 때문에 GC의 부하를 줄이고 애플리케이션의 처리량을 증가시킬 수 있다.
- Parallel GC는 Throughput GC라고도 부르며 CPU 코어 개수가 많고 메모리가 충분할 때 유리하다.
- mark-sweep-compact 알고리즘을 사용한다.
- -XX:+UseParallelGC
3. Parallel Old GC(Paralled Compaction GC)
- Parallel GC와 비교하여 Old 영역에 mark-summary-compact 알고리즘을 사용한다.
- Parallel GC 특징과 유사하며 스레드 개수를 옵션을 통해 지정할 수 있다.
- -XX:+ParallelGCThreads=n
- -XX:+UseParallelOldGC
4. Concurrent Mark-Sweep GC(CMS GC)
애플리케이션 스레드와 GC 스레드를 동시에 수행하여 stop-the-world 시간을 최소화하는데 목적이 있다. low-latency gc로도 알려져 있으며, young 영역에 대한 GC는 Parallel GC와 동일하다. Old 영역의 GC는 프로세스는 다음과 같다.
- Initial Mark : 매우 짧은 대기 시간으로 살아 있는 격체를 찾는다 (stop-the-world 발생)
- Concurrent Mark : 방금 살아있다고 확인한 객체에서 참조하고 있는 객체를 따라가면서 확인한다. 다른 스레드가 실행 중인 상태에서 stop-the-world 이벤트 없이 진행된다는 것이 특징이다.
- Remark : Concurrent Mark에서 확인하는 동안 새로 추가되거나 변경된 객체에 대해서 다시 확인한다. (stop-the-world 발생)
- Concurrent Sweep : 확인된 쓰레기를 정리한다. 이 작업도 다른 스레드가 실행 중인 상태에서 stop-the-world 이벤트 없이 진행된다는 것이 특징이다.
이러한 방식으로 진행되는 CMS GC는 stop-the-world 시간이 매우 짧기 때문에 응답속도가 매우 중요할 때 사용한다. Concurrent Mark-Sweep GC는 2개 이상의 프로세스를 사용하거나 힙 메모리의 영역의 크기가 클 때 적합하다.
하지만 stop-the-world 시간이 짧다는 장점도 있지만 단점도 있다.
다른 GC 방식보다 CPU와 메모리 소모가 많고 Compaction 단계가 기본적으로 제공되지 않는다. 조각난 메모리가 많은 경우 Compaction 작업을 실행하면 다른 GC 방식보다 stop-the-world 시간이 더 길어질 수 있다.
- XX:+UseConcMarkSweepGC
5. G1 GC(Garbage First GC)
G1은 그림과 같이 되어 있다. 편하게 생각하면 바둑판 모양이라고 생각하면 된다. 여기서 각 바둑판의 사각형을 region이라고 하는데, Young 영역이나 Old 영역이라는 단어와 구분하기 위해서 "구역"이라고 하자. 이 구역의 기본 크기는 1MB이며 최대 32MB까지 지정 가능하다. 그림에서 보듯이 G1은 Young 영역과 Old 영역이 물리적으로 나뉘어 있지 않고, 각 구역의 크기는 모두 동일하다. 앞서 살펴본 콜렉터들은 모두 Young과 Old 영역의 주소가 물리적으로 Linear 하게 나열되지만, G1은 그렇지 않다. 여기서 구역의 개수는 약 2000개 정도라고 한다.
- CMS GC를 대체하기 위해 나왔으며 JDK7에 정식으로 제공되었다.
- G1 GC는 이전에 설명했던 GC들과 완전히 다른 모습이다.
- 완전히 다른 레이아웃(바둑판 모양)을 가진 병렬 처리, 동시적 접근. 점진적 압축을 추구하며 다른 GC보다 더 낮은 stop-the-world 이벤트를 가지고 있다.
- XX:+UseG1GC
G1 GC VS Concurrent Mark-Sweep GC(CMS GC) 차이점
G1 GC는 바둑판 모양의 레이아웃으로 Heap 영역 전체를 N개로 쪼개어 각각의 영역에서 GC를 진행한다. CMS GC는 Heap 영역 전체를 하나로 GC를 진행한다.
'엔지니어링 > 성능과 튜닝' 카테고리의 다른 글
[성능과 튜닝] JAVA 메모리 관리 (스택&힙) (0) | 2019.05.31 |
---|---|
[성능과 튜닝] JAVA 메모리 관리 GC 기본 (0) | 2019.05.28 |
[성능과 튜닝] JMH 설치 및 설정 방법 (0) | 2019.03.03 |
[성능과 튜닝] 프로그램 성능 분석 (0) | 2019.02.22 |
- 개발환경
- 자바
- 성능분석
- 리눅스 명령어
- 회고
- 프로그래머스
- spring
- effective java
- SQL
- 프로그래머
- 제주도 여행
- 자바스크립트
- Linux 명령어
- 리액트 16
- 소프트웨어공학
- 경력관리
- 정렬 알고리즘
- Maven
- Eclipse
- React
- 오라클 내장 함수
- javascript
- 제주도 3박4일 일정
- 오라클
- sort algorithm
- 이직
- 리액트
- Collection
- Java
- Tomcat
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |