일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링부트
- 권한
- OAuth
- g1
- 리팩토링
- 페이징
- JPA
- jvm
- apache
- JWT
- java
- tomcat
- GC
- Security
- 페이스북
- RabbitMQ
- 비동기
- oauth2
- spring boot
- 시큐리티
- load balancing
- clean code
- Spring
- 클린코드
- gdg
- Refactoring
- Producer
- 스프링
- assertj
- 스프링 부트
- Today
- Total
허원철의 개발 블로그
Java - Garbage First(G1) Garbage Collection 본문
이번 글은 Garbage First(이하 G1) Garbage Collection에 대한 글 입니다.
간단한 소개
1) JDK 7 update 4 및 이후 Release에서 완전히 지원합니다.
2) 대용량 메모리가 있는 다중 프로세서를 대상으로한 서버 스타일 GC입니다.
3) GC Thread와 Application Thread와 동시에 수행합니다.
Heap Structure
- Heap 영역을 동일 크기로 분할합니다. (region이라고 칭합니다.)
- 1~32MB 정도로 나누고 있으며, 약 2000개 region이 생깁니다.
- region은 기존에 영역인 eden, survivor, old 중 하나 일 수 있습니다.
Heap Allocation
- G1은 Heap 영역들에서 비어있는 region을 파악하고 수집합니다. 그렇기 때문에 많은 양의 여유 공간이 생깁니다.
- 하나 이상의 region에서 단일 region으로 객체를 복사하고 프로세스 과정에서 압축하여 메모리를 비웁니다. 이는 병렬로 수행되기 때문에 처리량을 줄일 수 있고, STW을 줄일 수 있습니다.
- Humongous Region, Available/Unused Region이 새로 생겼습니다.
① Humongous Region : 객체가 큰 경우 사용됩니다. (일반 객체보다 30~50% 큰 경우에 해당됩니다.)
② Available/Unused Region : 아직 사용하지 않은 영역입니다.
- 추가로, Heap 6GB이상을 권장하고 있습니다.
※ G1이 필요한 경우
① Heap의 50% 이상이 실시간 데이터로 가득 찬 경우
② 객체 할당 비율이나 프로모션의 속도가 크게 다른 경우
③ GC 수집이 긴 경우
GC Process
1) Young GC
- Live Object는 하나 이상의 survivor region에 복사 또는 이동됩니다.
- Aging Threshold이 충족되면, old region으로 승격됩니다. (STW 발생)
2) Old GC
- 일부분 Young GC이 포함되어 있습니다.
① Initial Mark
- Young GC에서 Live Object의 초기 마킹을 피기백합니다.
② Concurrent Marking
- 빈 region(Live Object가 없는 것을 뜻하는 듯..?)이 발견되면, Remark 단계에서 즉시 제거 됩니다. 또한 liveness를 결정하는 accounting 정보에 계산됩니다.
Old GC KeyPoint
1) Concurrent Marking
- liveness 정보는 Application이 실행되는 동안 계산됩니다.
- liveness 정보는 Ebacuation 단계 중에 가장 좋은 region을 식별합니다.
- CMS와 같은 단계는 없습니다.
2) Remark
- CMS에서 사용된 알고리즘보다 훨씬 빠른 SATB 알고리즘을 사용합니다.
- 완전히 빈 지역은 제거됩니다.
3) Copying/Cleanup
- Young GC와 Old GC가 동시에 진행됩니다.
- Old GC는 liveness에 의애 선택됩니다.
참고
- http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
'java' 카테고리의 다른 글
Google - Guava (423) | 2017.04.06 |
---|---|
Thread Pool 이해하기 (401) | 2017.04.01 |
Java - JVM Architecture (429) | 2017.03.08 |
Java - Compare GC (406) | 2017.03.07 |
Java - GC (Garbage Collection) (420) | 2017.03.05 |