Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon 쓰레기 수집 일시 정지를 최소화하기 위해 JVM 매개 변수를 구성하려면 어떻게해야합니까?


쓰레기 수집 일시 정지를 최소화하기 위해 JVM 매개 변수를 구성하려면 어떻게해야합니까?


GC (Garbage Collection)를 최소화하기 위해 JVM 매개 변수를 구성하려면 다양한 쓰레기 수집기의 기본 작업과 JVM에서 사용 가능한 튜닝 메커니즘을 이해하는 것이 중요합니다. 구성 프로세스에는 적절한 쓰레기 수집 알고리즘을 선택하고 힙 크기 조정, 일시 정지 시간 목표 구성, 스레드 매개 변수 및 메모리 영역 최적화가 포함됩니다. 아래는 권위있는 출처 및 모범 사례를 기반으로 GC 일시 중지를 최소화하기위한 JVM 튜닝의 자세한 합성입니다.

올바른 쓰레기 수집기 선택

JVM은 처리량, 일시 중지 시간 및 자원 사용에 관한 특성이 다른 여러 쓰레기 수집 알고리즘을 제공합니다.

-ERIAL GC : GC에 단일 스레드를 사용합니다. 수집하는 동안 모든 응용 프로그램 스레드를 중지하여 긴 일시 중지를 초래합니다. 일반적으로 더 큰 응용 분야에서 일시 정지를 최소화하는 데 적합하지 않습니다.
- 병렬 GC : 여러 스레드를 사용하여 쓰레기 수집을 수행하여 여러 CPU 코어를 활용하여 직렬 GC에 비해 일시 중지 시간을 줄입니다. 처리량 지향적이지만 여전히 GC 동안 응용 프로그램 스레드를 일시 중지합니다.
-CMS (Concurrent Mark-Sweep) GC : 신청서와 동시에 쓰레기 수집 작업의 대부분을 수행하여 특정 GC 단계에서 응용 프로그램을 잠시 일시 중지하여 일시 정지 시간을 크게 줄입니다. 저도가 낮은 응용 프로그램에 적합합니다.
- 쓰레기 먼저 (G1) GC : 힙을 지역으로 나누고 가장 먼저 쓰레기를 가진 지역을 수집하는 데 중점을 둡니다. 동시 및 평행 단계를 혼합하여 예측 가능한 일시 중지 시간과 양호한 처리량을 제공하는 것을 목표로합니다. 그것은 종종 최신 JVM 버전의 기본입니다.
-Shenandoah 및 ZGC : 이러한 저도 수집가는 동시에 모든 또는 대부분의 GC 작업을 수행하여 매우 짧거나 거의 눈에 띄지 않는 일시 정지를 목표로하며 큰 힙 및 반응이 높은 응용 프로그램에 적합합니다.

올바른 수집기를 선택하는 것은 최대 허용 일시 중지 시간, 힙 크기 및 워크로드 특성과 같은 응용 프로그램 요구 사항에 따라 다릅니다.

힙 크기 구성

힙 크기는 GC 주파수 및 일시 정지 기간에 직접적인 영향을 미칩니다.

-초기 및 최대 힙 크기를 동일하게 설정하십시오. 동일한 값으로`-xms` 및`-xmx`를 사용하면 힙 크기 조정을 피하면 런타임 중 일시 중지를 도입 할 수 있습니다.
- 적절한 힙 크기 : 아 할당하는 힙은 자주 컬렉션을 유발하여 일시 중지가 증가합니다. 그러나 과도하게 할당하면 GC 사이클이 더 길어집니다. 응용 프로그램 메모리 요구에 따라 균형을 찾으십시오.
- GC 로그 및 힙 사용 메트릭을 모니터링하여 힙 크기를 적절하게 조정하십시오.

GC 일시 정지 시간 제어

JVM은 최대 GC 일시 중지 시간에 대한 목표를 설정하는 매개 변수를 제공합니다.

-`-xx : maxgcpausemillis =`: 수집가가 만나기 위해 대상 최대 일시 중지 시간을 밀리 초로 설정합니다. 보장되지는 않지만 JVM은이 일시 정지 시간을 초과하지 않도록 처리량 및 GC 작업을 조정하려고 시도합니다.
-이 매개 변수는 G1 GC 또는 일시 정지 시간 목표를 지원하는 다른 수집기를 사용하여 처리량 및 대기 시간 균형을 유지할 수 있도록 JVM을 안내합니다.

스레딩 및 병렬 처리

쓰레기 수집 중에 여러 스레드를 활용하면 일시 정지 기간이 줄어 듭니다.

-`-xx : parallelgcthreads =`: GC의 병렬 단계에서 사용되는 스레드 수를 설정합니다. 더 많은 스레드는 일시 정지 시간을 줄일 수 있지만 CPU 사용량을 증가시킬 수 있습니다.
-`-xx : concgcthreads =`: CMS 및 G1과 같은 동시 수집기의 경우 동시상을 수행하는 스레드 수를 설정합니다.
- 최적의 스레드 수는 사용 가능한 CPU 코어 수 및 워크로드와 정렬되어야합니다. 과도 교회 스레드는 성능을 저하시킬 수 있습니다.

젊고 구식 크기를 조정합니다

힙은 일반적으로 젊은이와 노인으로 나뉩니다. 크기 조정은 GC 동작에 영향을 미칩니다.

- 젊은 세대 크기 : 젊은 세대가 커지면 경미한 GC의 빈도가 줄어들지 만 작은 GC 일시 중지 시간이 증가합니다. 객체 할당 속도에 따라 조정하십시오.
- 구식 크기 : 메이저/풀 GCS가 얼마나 자주 실행되는지와 지속 시간에 영향을 미칩니다.
-G1 GC는 힙을 많은 동일한 크기의 영역으로 나누고 크기를 동적으로 관리하지만`-xx : initiatingHeapoccupancePercent`와 같은 매개 변수로 튜닝 시작 임계 값을 허용합니다.

쓰레기 수집기 특정 매개 변수

현대 JVMS에서 일반적으로 사용되는 G1 GC의 경우 :
-`-xx :+useg1gc` : G1 GC를 활성화합니다.
-`-xx : maxgcpausemillis =`: 일시 중지 시간 대상.
-`-xx : initiatingHeapoccupancePercent =`: 힙 이이 점유에 도달하면 동시에 표시를 시작합니다.
-`-xx :+usestringdedUplication ': 정화 문자열을 통해 메모리 발자국을 줄입니다.
- G1의 일시 정지 시간 목표를 방해 할 수 있으므로 젊은 세대 규모를 명시 적으로 설정하지 마십시오.

CMS GC의 경우 :
-`-xx :+useconcmarksweepgc` : cms를 활성화합니다.
-시작 임계 값 및 스레드 카운트를 조정하여 글로벌 정지 정지 일시 정지를 줄이는 데 중점을 둡니다.

병렬 GC (처리량 지향)의 경우 :
-`-xx :+useparallelgc` 및`-xx :+useparalleloldgc` : 젊은 세대와 노인 세대의 병렬 GC를 활성화합니다.
-`-xx : parallelgcthreads`를 사용하여 GC 스레드의 수를 조정하십시오.

객체 할당 속도 감소

새 객체가 생성되는 속도를 줄이면 GC 압력이 줄어 듭니다.

- 프로파일 및 최적화 코드를 최적화하여 불필요한 객체 생성을 최소화합니다.
- 객체 풀링을 사용하고 가능하면 재사용하십시오.
- 더 나은 개체 할당 패턴을 위해 내부 메모리 영역을 조절하도록 JVM 매개 변수를 조정하십시오.

명시적인 GC 통화를 피하십시오

-`-xx :+disablexplicitgc`를 사용하여 전체 GC 일시 정지를 트리거 할 수있는 응용 프로그램 코드 또는 외부 도구에서 명시적인 GC 통화를 비활성화합니다.

모니터링 및 로깅

GC 동작을 이해하고 조정하려면 자세한 GC 로깅을 활성화하십시오.

-`-xlog : gc*`를 사용하여 통합 로깅을 지원하는 JVMS (Java 9+)를 사용하십시오.
-구형 JVM에서`-xx :+printgcdetails -xx :+printgcdatestamps -xloggc :`을 사용하십시오.

로그를 분석하여 일시 정지 원인을 식별하고 그에 따라 조정하십시오.

일반 권장 사항

- 구식 JVM 인수를 제거하여 깨끗한 슬레이트로 튜닝을 시작하십시오.
- 생산과 같은 환경의 테스트 변경.
- Java Flight Recorder, VisualVM 또는 상업용 프로파일 러와 같은 도구를 사용하여 GC 및 메모리 사용 데이터를 수집하십시오.
- 관찰 된 GC 일시 정지 시간, 처리량 및 응용 프로그램 응답 성을 기반으로 튜닝 단계를 반복합니다.

요약하면, JVM 쓰레기 수집 일시 정지를 최소화하려면 적절한 쓰레기 수집기 (바람직하게는 G1, ZGC 또는 Shenandoah가 낮은 일시 정지 요구 사항에 대한 Shenandoah), 적절한 크기의 힙 및 세대를 선택하고, 일시 정지 시간 목표를 설정하고, 동시성 스레드를 조정하고, 개체 할당 속도를 최소화하고, GCS를 비활성화하고, 엄중 한 모니터링을 선택하는 것이 포함됩니다. 세부 사항은 응용 프로그램 워크로드, 힙 크기, JVM 버전 및 하드웨어 특성에 따라 다릅니다. 원하는 처리량 및 일시 중지 시간의 균형을 달성하기 위해 모니터링 도구 및 상세한 GC 로그를 통해 점차적으로 조정하고 검증해야합니다.

이 접근법은 JVM의 쓰레기 수집이 애플리케이션 성능에 대한 최소한의 중단으로 효율적으로 작동하도록합니다.