Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- KEVISS
- 생성자 주입
- MSA
- 재정의
- 테스트 코드
- DDL
- Test
- 바이너리 카운팅
- hashcode
- docker
- SQL
- java
- Spring
- jwt
- 인덱스
- static
- stream
- equals
- 조합
- select_type
- DI
- lambda
- VUE
- 필드 주입
- jpa
- StringBuilder
- 열 속성
- cache
- redis
- AOP
Archives
- Today
- Total
백엔드 개발자 블로그
G1 GC vs ZGC 본문
G1 GC란?
- 이전의 GC는 Young Generation, Old Generation 영역이 고정적이었다
- G1 GC는 전체적인 heap 메모리를 고정된 영역이 아닌 논리적인 단위로 분리한다
- G1 GC는 사용하지 않는 개체의 영역을 수집하고 압축하여 STW를 최소화하였다
- JDK 9부터는 디폴트로 설정되어 있다
G1 GC 동작원리
- initial mark : old region에서 존재하는 개체들이 참조하는 survivor region을 찾는다
- root region scan : initial mark에서 확인한 region안에 있는 개체를 마킹한다
- concurrent mark : heap 메모리를 전체적으로 스캔하면서 unrechable 개체의 region을 확인한다
- remark : 애플리케이션을 멈추고 최종적으로 GC 대상에서 제외될 개체를 식별해낸다
- clean up : 살아 있는 개체가 가장 적은 region에 대해서 미사용 개체를 제거한다
- copy : 제거되지 않고 region에 살아남은 개체들은 새로운 region에 복사하며 compact 작업을 수행한다
ZGC란?
- ZGC는 ZPages를 사용하는데 이는 G1 GC의 Region과 비슷한 영역의 개념을 사용한다
- G1 GC의 Region의 크기는 고정이고, ZPages는 크기가 2의 배수로 동적으로 생성 및 삭제가 가능하다
- ZGC의 성능을 확보하기 위해서는 메모리가 8MB 부터 16TB 성능의 서버에서 사용할 수 있다
- G1 GC의 compact 과정에서 기존 개체와 새로운 region에 복사된 새로운 개체간 동기화가 정상적으로 이루어지지 않을 수 있다는 문제가 존재한다
- 그리고 가용할 수 있는 region을 확보해서 할당해야 하는데 이는 상당한 비용이 든다
- 이를 개선하고자 ZGC의 compact 과정은 새로운 region을 생성한 후 살아있는 개체들을 채우도록 동작한다
- ZGC의 목표는 모든 종류의 고비용 작업을 동시 작업하고 STW를 10ms를 미만으로 줄이는 것이다
- 단 ,ZGC는 메모리가 8MB ~ 16TB 정도로 고사양의 서버가 필요하다
ZGC 동작원리
- ZGC Heap은 위 그림과 같이 다양한 사이즈의 영역이 여러개 발생할 수 있다.
- ZGC가 compaction된 후, ZPage는 ZPageCache라 불리는 캐시에 삽입된다.
- 캐시 안의 ZPage는 새로운 Heap 할당을 위해 재사용할 준비를 한다.
- 메모리를 커밋과 커밋하지 않는 작업은 비용이 크기에 캐시의 성능에 중요한 영향을 끼친다.
참고
- https://renuevo.github.io/java/garbage-collection/
- https://thinkground.studio/2020/11/07/
- https://imprint.tistory.com/35
- https://www.blog-dreamus.com/post/zgc
- https://steady-coding.tistory.com/590
- https://woooongs.tistory.com/54
- https://kchanguk.tistory.com/175
- https://blog.leaphop.co.kr/blogs/42
- https://huisam.tistory.com/entry/jvmgc#ZGC
'Java' 카테고리의 다른 글
Enum (0) | 2024.04.29 |
---|---|
JIT Compiler (0) | 2024.04.29 |
heap dump 분석하기 (feat. OOM) (0) | 2024.04.29 |
병렬처리를 이용한 이미지 리사이즈 개선 (0) | 2024.04.29 |
블럭킹 | 논블럭킹 | 동기 | 비동기 (0) | 2024.04.29 |