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에 대해 배웠습니다. 사용의 의미에 대해 배웠고 유용 할 수있는 몇 가지 사례를 검토했습니다.