1. 소개

Java 11은 가능한 가장 낮은 GC 오버 헤드약속하는 Epsilon이라는 No-Op Garbage Collector를 도입했습니다 .

이 짧은 튜토리얼에서는 Epsilon이 어떻게 작동하는지 살펴보고 일반적인 사용 사례를 언급 할 것입니다.

2. 빠른 실습

손을 더럽히는 것부터 시작하여 Epsilon GC를 사용해 보겠습니다!

먼저 쓰레기를 생성하는 애플리케이션이 필요합니다.

class MemoryPolluter {

    static final int MEGABYTE_IN_BYTES = 1024 * 1024;
    static final int ITERATION_COUNT = 1024 * 10;

    static void main(String[] args) {
        System.out.println("Starting pollution");

        for (int i = 0; i < ITERATION_COUNT; i++) {
            byte[] array = new byte[MEGABYTE_IN_BYTES];
        }

        System.out.println("Terminating");
    }
}

이 코드는 루프에서 1 메가 바이트 배열을 만듭니다. 루프를 10240 번 반복하기 때문에 10GB의 메모리를 할당한다는 의미입니다. 이는 사용 가능한 최대 힙 크기보다 더 클 수 있습니다.

또한 응용 프로그램이 종료되는시기를 확인하기 위해 몇 가지 도우미 인쇄를 제공했습니다.

Epsilon GC를 사용하려면 다음 VM 인수를 전달해야합니다.

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

그리고 응용 프로그램을 실행하면 다음과 같은 오류가 발생합니다.

Starting pollution
Terminating due to java.lang.OutOfMemoryError: Java heap space

그러나 표준 VM 옵션으로 동일한 애플리케이션을 실행하면 정상적으로 완료됩니다.

Starting pollution
Terminating

첫 번째 실행이 실패한 이유는 무엇입니까? 가장 기본적인 가비지 수집기조차도 방금 시연 한 어린이 놀이를 정리할 수있는 것 같습니다 !

그래서 방금 일어난 일을 이해하기 위해 Epsilon GC의 개념을 살펴 보겠습니다.

3. Epsilon GC의 작동 원리

Epsilon은 작동하지 않는 가비지 수집기입니다.

JEP 318 은“ [Epsilon]…은 메모리 할당을 처리하지만 실제 메모리 회수 메커니즘을 구현하지 않습니다. 사용 가능한 Java 힙이 모두 소모되면 JVM이 종료됩니다.

따라서 이는 애플리케이션이 OutOfMemoryError로 종료 된 이유를 설명합니다 .

그러나 그것은 질문을 제기합니다. 왜 우리는 쓰레기를 수집하지 않는 쓰레기 수집기가 필요합니까?

사용 가능한 힙이 충분하다는 것을 알고있는 경우 가 있으므로 JVM이 리소스를 사용하여 GC 작업을 실행하는 것을 원하지 않습니다.

이러한 경우의 몇 가지 예 (관련 JEP에서도 참조) :

  • 성능 시험
  • 메모리 압력 테스트
  • VM 인터페이스 테스트
  • 매우 짧은 수명의 일자리
  • 마지막 드롭 대기 시간 개선
  • 마지막 드롭 처리량 향상

4. 결론

이 짧은 기사에서 우리는 Java 11에서 사용할 수있는 no-op GC 인 Epsilon에 대해 배웠습니다. 사용의 의미에 대해 배웠고 유용 할 수있는 몇 가지 사례를 검토했습니다.

평소처럼 예제는 GitHub에서 사용할 수 있습니다 .