JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)

JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)

Summary

실행중인 Java 스레드와 동시에 대피 작업을 수행하여 GC 일시 정지 시간을 줄이는 Shenandoah라는 새 가비지 콜렉션 (GC) 알고리즘을 추가하십시오.
Shenandoah의 일시 정지 시간은 힙 크기와 무관하므로 힙이 200MB 또는 200GB인지에 관계없이 동일한 일시 정지 시간을 갖게됩니다.

Non-Goals

이것은 모두를 지배하는 GC가 아닙니다. 응답 성보다 처리량 또는 메모리 풋 프린트를 우선시하는 다른 가비지 수집 알고리즘이 있습니다.
Shenandoah는 응답 성과 예측 가능한 짧은 일시 정지를 중시하는 애플리케이션에 적합한 알고리즘입니다.
모든 JVM 일시 정지 문제를 해결하는 것이 목표는 아닙니다.
TTSP (Time To Safe Point) 문제 또는 인플레이션 모니터와 같은 GC 이외의 이유로 인한 일시 중지 시간은이 JEP의 범위를 벗어납니다.

Success Metrics

정량적우리가 일관된 짧은 gc 일시 정지 시간을 유지할 수 있다면이 프로젝트는 성공할 것입니다.

Description

최신 컴퓨터에는 그 어느 때보 다 많은 메모리와 프로세서가 있습니다.
SLA (Service Level Agreement) 애플리케이션은 10-500ms의 응답 시간을 보장합니다.
이 목표의 최저 수준을 달성하기 위해서는 가용 메모리에서 프로그램을 실행할 수있을만큼 효율적이지만 수 밀리 초 이상 동안 실행중인 프로그램을 중단하지 않도록 최적화 된 가비지 수집 알고리즘이 필요합니다.
셰넌 도어 (Shenandoah)는 OpenJDK의 오픈 소스 저 일시 중지 시간 수집기로서 이러한 목표에보다 근접하게 설계되었습니다.

Shenandoah는 일시 중지 시간 개선을 위해 동시 CPU주기와 공간을 교환합니다.
Java 스레드가 실행되는 동안 GC 스레드가 힙을 압축 할 수 있도록 모든 Java 오브젝트에 대한 간접 포인터를 추가했습니다.
마킹과 압축은 동시에 수행되므로 객체 그래프의 근을 찾아 업데이트하기 위해 스레드 스택을 스캔 할만큼 Java 스레드를 일시 중지하면됩니다.

Shenandoah 알고리즘은 이 PPPJ2016 논문 에 자세히 설명되어 있습니다.

Shenandoah는 aarch64 및 amd64를 위해 Red Hat에서 구현되었으며 지원 될 예정입니다.

셰넌 도어에 대한 지속적인 개발은 OpenJDK 셰넌 도어 프로젝트 에서 이루어집니다 .
Shenandoah 위키 페이지 에서 현재 개발 흐름, 구현 세부 정보, 가용성에 대한 자세한 내용을 참조하십시오 .

Alternatives

Zing / Azul에는 일시 중지 수집기가 있지만 해당 작업은 OpenJDK에 기여하지 않았습니다.

ZGC에는 컬러 포인터를 기반으로 한 일시 중지 수집기가 있습니다. 우리는 두 전략의 성과를 비교하기를 기대합니다.

G1은 병렬 작업과 동시 작업을 수행하지만 동시 대피 작업은 수행하지 않습니다.

CMS는 동시 마킹을 수행하지만 일시 중지 시간에 젊은 세대 복사를 수행하며 이전 세대를 압축하지 않습니다.
이로 인해 구세대의 여유 공간 및 조각화 문제를 관리하는 데 더 많은 시간이 소요됩니다.

Building and Invoking

실험적인 기능으로 셰넌 도어는 -XX:+UnlockExperimentalVMOptions명령 줄에 필요할 것 입니다.
Shenandoah 빌드 시스템은 지원되지 않는 구성에 대한 빌드를 자동으로 비활성화합니다.
다운 스트림 빌더는 –with-jvm-features=-shenandoahgc 지원되는 플랫폼에서 셰넌 도어 빌드를 비활성화 할 수 있습니다 .

Shenandoah GC를 활성화 / 사용하려면 다음 JVM 옵션이 필요 -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC합니다..

Shenandoah GC 설정 및 조정 방법에 대한 자세한 정보 는 Shenandoah 위키 페이지 를 참조하십시오.

Testing

Red Hat은 중요한 응용 프로그램에 대한 광범위한 테스트를 수행했습니다.
우리는 많은 셰넌 도어 특정 jtreg 테스트를 개발했습니다.
Shenandoah는 Fedora 24에서 시작하여 Rhel 7.4의 기술 미리보기로 Fedora에서 배송됩니다.
표준 OpenJDK 테스트를 실행 -XX:+UseShenandoahGC하면 충분합니다.

Risks and Assumptions

GC 인터페이스 (JEP 304)는 JDK 11에 통합되었으며 그 이후로 GC 인터페이스에 대한 많은 확장 및 개선이 이루어졌습니다.
이것은 OpenJDK 소스베이스에 Shenanodah를 추가 할 위험을 최소화합니다.
또한 합리적으로 해결할 수없는 셰넌 도어 특정 코드 경로는 #ifdef INCLUDE_SHENANDOAHGC이와 유사한 메커니즘에 의해 보호됩니다.
Shenandoah GC는 처음에 실험 기능으로 표시되므로 -XX:+UnlockExperimentalVMOptions에 추가해야 -XX:+UseShenandoahGC합니다.

참조