-
[JAVA] GC 튜닝CS/개발 언어 (JAVA) 2021. 6. 26. 11:27
GC 튜닝의 두 가지 목적
Old 영역으로 넘어가는 객체의 수 최소화 하기
- G1 GC를 제외한 Oracle JVM에서 지원하는 모든 GC는 Generational GC이다.
- Eden 영역에서 객체가 처음 만들어지고, Survivor 영역을 오가다가, 끝까지 남아 있는 객체는 Old 영역으로 이동한다.
- Old 영역의 GC는 Young 영역의 GC에 비하여 상대적으로 시간이 오래 소요되기 때문에 Old 영역으로 넘어가는 객체의 수를 줄이면 Full GC가 발생하는 빈도를 줄일 수 있다.
- Young 영역의 크기를 잘 조절함으로써 효과를 볼 수 있다.
Full GC 시간 줄이기
- Full GC 실행에 시간이 오래 소요되면(1초 이상) 연관된 여러 부분에서 타임아웃이 발생 할 수 있다.
- Old 영역의 크기를 줄이면
- OutOfMemoryError가 발생하거나 Full GC 횟수가 늘어난다.
- Old 영역의 크기를 늘리면
- Full GC 횟수는 줄어들지만 실행 시간이 늘어난다.
- Old 영역의 크기를 줄이면
- Old 영역의 크기를 잘 조절함으로써 효과를 볼 수 있다.
GC의 성능을 결정하는 옵션
구분 옵션 설명 힙(heap) 영역의 크기 -Xms JVM 시작 시 힙 영역 크기 -Xmx 최대 힙 영역 크기 New 영역의 크기 -XX:NewRatio New 영역과 Old 영역의 비율 -XX:NewSize New 영역의 크기 -XX:SurvivorRatio Eden 영역과 Survivor 영역의 비율 GC 튜닝의 절차
1. GC 상황 모니터링
2. 모니터링 결과 분석 후 GC 튜닝 여부 결정
- GC 수행 시간이 1~3초, 심지어 10초가 넘는 상황이라면 GC 튜닝을 진행해야 한다.
- GC가 수행되는 시간을 확인했을 때 다음의 조건에 부합되면 GC 튜닝이 필요 없다.
- Minor GC의 처리 시간이 빠르다. (50ms 내외)
- Minor GC의 주기가 빈번하지 않다. (10초 내외)
- Full GC의 처리 시간이 빠르다. (보통 1초 내외)
- Full GC의 주기가 빈번하지 않다. (10분에 1회)
3. GC 방식/메모리 크기 결정
- GC 튜닝을 진행하기로 결정했다면 GC 방식을 선정하고 메모리의 크기를 결정한다. 이 때 서버가 여러 대이면 여러 대의 서버에 GC 옵션을 서로 다르게 지정해서 GC 옵션에 따를 차이를 확인하는 것이 중요하다.
4. 결과 분석
- GC 옵션을 지정하고 적어도 24시간 이상 데이터를 수집한 후에 분석을 진행한다.
5. 결과가 만족스러울 경우 전체 서버에 반영 및 종료
https://d2.naver.com/helloworld/37111
'CS > 개발 언어 (JAVA)' 카테고리의 다른 글
[JAVA] Garbage Collection 모니터링 (1) 2021.06.21 [개발언어] @Controller vs @RestController (0) 2021.06.04 [JAVA] Reactive Streams (0) 2021.05.16 [JAVA] 자바 가상 머신 (Java Virtual Machine) (0) 2021.05.12 [JAVA] JVM Memory (0) 2021.04.22 - G1 GC를 제외한 Oracle JVM에서 지원하는 모든 GC는 Generational GC이다.