Java12

업데이트:

주요 변경사항

JAVA 12

  • 자세한 내용은 OpenJDK 공식 변경사항1을 참조하기 바란다.

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

Shenandoah[^shenandoah]는 실행중인 Java 프로그램과 동시에 더 많은 Garbage Collection을 수행하여 Garbage Collector의 일시 중지 시간을 줄이는 Garbage Collector이다.

shenandoah 실행 단계는 Root Set을 스캔 후 Concurrent mark을 수행한다. 이후 두번째 정지로 대기열을 비우고 다시 루트 세트를 검색하여 Concurrent mark를 완료하여 라이브 개체가 없는 영역의 회수와 다른 지역으로 복사를 한다. 그 이후 업데이트 참조 단계를 초기화하고 이동이 된 개체에 대한 참조와 기존 Root Set를 업데이트하여 업데이트 참조 단계를 완료한다. 마지막으로 참조가 없는 컬렉션 영역을 회수한다.

Microbenchmark Suite

JDK 소스 코드에 기본 마이크로 벤치 마크 제품군을 추가하였다. 이를 통해 개발자가 기존 마이크로 벤치 마크를 쉽게 실행하고 새 마이크로 벤치 마크를 만들 수 있게 되었다. Microbenchmark 제품군의 벤치 마크 세트는 JMH JDK Microbenchmarks 프로젝트2에서 가져오면된다.

Switch Expressions (Preview)

명령문 또는 표현식으로 사용할 수 있도록 Switch 표현식을 개선시켰다. 단지 이 기능은 미리보기 기능3이다.

public class Switch {
  public static void main(String[] args) {
    System.out.println(getMessageInJava11(args.length));
    System.out.println(getMessageInJava12(args.length));
  }
  // Java11
  private static String getMessageInJava11(int count) {
    switch(count) {
      case 1:
        return "have one args.";
      case 2:
        return "have two args.";
      default:
        return "have more than two args.";
    }
  }
  // Java12
  private static String getMessageInJava12(int count) {
    return switch(count) {
      case 1 -> "have one args.";
      case 2 -> "have two args.";
      default -> "have more than two args.";
    }
  }
}

JVM Constants API

모든 Java 클래스는 내부의 메서드와 클래스, String과 Integer 같은 값을 바이트 코드 형태로 저장하는 아래와 같은 상수 풀 테이블이 존재한다.

cp_info {
  u1 tag;
  u1 info[];
}

JVM 명령 (Ex: ldc, invokedynamic)은 이 테이블의 정보에 의존한다. 이러한 명령어가 실행되면로드 가능한 상수는 Class, String, int 등과 같은 라이브 값이된다. 새 패키지 java.lang.invoke.constant는 클래스 파일 및 런타임 아티팩트, 특히 상수 풀에서 로드 할 수 있는 상수의 명목상 설명을 모델링하는 API를 도입한다.

One AArch64 Port, Not Two

모든 기여자가 단일 64-bit ARM 구현에 대한 집중과 두 개의 포트를 유지하는 데 필요한 중복 작업을 하지 않도록, 32-bit ARM 포트와 64-bit aarch64 포트를 유지하면서 arm64 포트와 관련된 모든 소스를 제거한다.

Default CDS Archives

64-bit 플랫폼에서 기본 클래스 목록을 사용하여 클래스 데이터-공유(CDS) 아카이브를 생성하도록 JDK 빌드 프로세스를 개선하였다. JDK 11 Early-Access Build 14를 사용하여 Linux/x64에서 측정 한 결과 실행 중인 시작 시간이 32%나 단축된 것을 확인 하였고, 다른 64-bit 플랫폼에서는 비슷하거나 더 높은 시작 성능 향상이 관찰되었다.

Abortable Mixed Collections for G1

G1 Garbage Collection이 휴리스틱 수가 너무 큰 Collection Set을 선택 할 경우, 목표된 일시 중지 시간을 초과할 수 있으므로 효율적으로 동작하도록 하기 위해서 중단 가능한 Collection을 가지도록 변경하였다.

G1 May Uncommit Memory During Marking Cycle

G1은 이제 활성화 상태일 때 운영 체제에 Java의 힙 메모리를 돌려 줄 수 있다. G1은 Full GC가 일어나거나 Concurrent cycle이라는 상황에만 Java의 힙 메모리를 운영체제에 반환하고 있다. 하지만 Full GC는 Java에서 지양하므로 Concurrent Cycle만 해당 반환 작업이 가능한데, 외부에서 강제하지 않는 한 대부분 힙 메모리를 반환하지 않는다. 애플리케이션에 모든 메모리가 필요하지 않은 경우 Java 프로세스의 메모리 사용을 향상시킨다.

Reference

※ Sample Code는 여기에서 확인 가능합니다.

댓글남기기