JDK 12 : Java 12의 새로운 기능

이제 Java SE (Standard Edition) 12를 기반으로 한 Java Development Kit 12의 프로덕션 릴리스를 사용할 수 있습니다. JDK 12 빌드는 Linux, Windows 및 MacOS 용 Oracle에서 사용할 수 있습니다. 

JDK 12 다운로드 위치

Java.net 웹 사이트에서 JDK 12를 다운로드 할 수 있습니다.

오픈 소스 빌드는 클래스 경로 예외와 함께 GNU General Public License v2에 따라 제공됩니다. Oracle의 JDK 12 상용 빌드는 비 오픈 소스 라이선스로 Oracle Technology 네트워크에서 찾을 수 있습니다.

Java 12의 새로운 기능

Shenandoah 가비지 수집기

Java 12는 실험적인 가비지 수집 알고리즘 인 Shenandoah를 추가하여 Java 스레드 실행과 동시에 비우기 작업을 수행하여 가비지 수집 일시 중지 시간을 줄입니다. Shenandoah는 응답 성과 예측 가능한 짧은 일시 중지를 중요시하는 애플리케이션에 적합한 알고리즘을 제공합니다. 그러나 의도는 모든 JVM 일시 중지 문제를 수정하는 것이 아닙니다.

Red Hat은 현재 Aarch64 및 AMD64 아키텍처에서 Shenandoah를 지원합니다.

G1 가비지 수집기에 대한 중단 가능한 혼합 컬렉션

Java 12는 일시 중지 대상을 초과 할 수있는 경우 G1 혼합 컬렉션을 중단 할 수 있도록합니다. G1의 목표는 수집 일시 중지에 대해 사용자가 제공 한 일시 중지 시간 목표를 충족하는 것이 었습니다.

이전에는 고급 분석 엔진이 수집 중에 수행 할 작업량을 선택했습니다. 그 결과 컬렉션 세트라고하는 지역 세트가 탄생했습니다. 세트가 결정되고 수집이 시작되면 G1은 모든 지역의 컬렉션 영역에있는 모든 라이브 개체를 중단없이 수집했습니다. 그러나 응용 프로그램의 휴리스틱 스가 너무 큰 컬렉션 집합을 선택한 경우 G1이 일시 중지 시간 목표를 초과 할 수 있습니다.

휴리스틱 스가 수집에 대해 잘못된 양의 작업을 반복적으로 선택하는시기를 감지하고,이 경우 G1이 수집 작업을 단계적으로 점진적으로 수행하도록하여 각 단계 후에 수집을 중단 할 수있는 메커니즘이 필요했습니다. Java 12에 도입 된 메커니즘을 통해 G1은 일시 중지 시간 목표를 더 자주 충족 할 수 있습니다.

사용되지 않은 커밋 된 메모리의 신속한 반환

Java 12는 유휴 상태 일 때 운영 체제에 Java 힙 메모리를 자동으로 반환하도록 G1을 향상시킵니다. 이 메모리는 응용 프로그램 활동이 매우 낮은 적절한 기간에 해제됩니다.

이전에는 G1이 전체 가비지 수집 또는 동시주기 동안 힙에서 메모리 만 반환했습니다. G1이 전체 가비지 수집을 피하고 힙 점유 및 할당 활동을 기반으로 한 동시 주기만 트리거하면 외부에서 강제로 수행하지 않는 한 많은 경우 힙 메모리를 반환하지 않습니다. 이 동작은 리소스를 사용하여 지불하는 컨테이너 환경에서 불리했습니다. JVM이 비활성으로 인해 할당 된 메모리의 일부만 사용하더라도 G1은 전체 힙을 유지했습니다. 따라서 고객은 항상 모든 리소스에 대해 비용을 지불했으며 클라우드 공급자는 하드웨어를 최대한 활용할 수 없었습니다.

Java 12를 사용하면 JVM이 힙 활용도가 낮은 단계를 감지하고 해당 시간 동안 힙 사용량을 자동으로 줄일 수 있습니다. 

JVM 상수 API

이 API는 키 클래스 파일 및 런타임 아티팩트, 특히 상수 풀에서로드 할 수있는 상수에 대한 명목상 설명을 모델링합니다. Java 12는 java.lang.invoke.constant로드 가능한 상수의 각 종류를 설명하기 위해 새 패키지에서 값 기반 기호 참조 유형 제품군을 정의합니다 .

상수 풀은 모든 Java 클래스에 존재하며 클래스에 피연산자와 바이트 코드 명령어를 저장합니다. 상수 풀의 항목은 클래스 및 메서드와 같은 런타임 아티팩트 또는 문자열 및 정수와 같은 간단한 값을 설명합니다. 이러한 항목을로드 가능한 상수라고합니다.

클래스 파일을 조작하는 프로그램은 바이트 코드 명령어를 모델링하고 차례로로드 가능한 상수를 모델링해야합니다. 그러나로드 가능한 상수를 모델링하기 위해 표준 Java 유형을 사용하는 것은 부적절합니다. 이것은 문자열을 설명하는로드 가능한 상수에 대해 허용 될 수 있지만 "라이브" Class객체를 생성하는 것은 클래스로드의 정확성과 일관성에 의존 하기 때문에 클래스를 설명하는로드 가능한 상수에 대해서는 문제가 됩니다. 그러나 클래스 로딩에는 많은 환경 종속성과 실패 모드가 있습니다.

따라서로드 가능한 상수를 처리하는 프로그램은 클래스 및 메서드와 메서드 핸들 및 동적으로 계산 된 상수와 같은 덜 알려진 아티팩트를 명목상의 기호 형식으로 조작 할 수 있다면 단순화 될 수 있습니다. 따라서 JVM 상수 API는 라이브러리와 도구에로드 가능한 상수를 설명하는 단일 표준 방법을 제공합니다.

향상된 시작, CDS 및 가비지 수집

Java 12는 64 비트 플랫폼에서 기본 클래스 목록을 사용하여 기본 클래스 데이터 공유 (CDS) 아카이브를 생성하도록 JDK 빌드 프로세스를 향상시킵니다. 이렇게하면 기본 시작 시간이 향상되고 -Xshare:dumpCDS를 활용 하기 위해 실행할 필요가 없습니다 . JDK 빌드 프로세스가 java-xshare:dump이미지 링크 후 실행되도록 수정되었습니다 .

일반적인 경우에 대한 메모리 레이아웃을 개선하기 위해 가비지 수집 힙 시간을 미세 조정하는 추가 명령 줄 옵션이 포함되었습니다. 애플리케이션 클래스 및 다양한 가비지 컬렉션 구성을 포함하는 사용자 지정 클래스 목록과 같은 고급 요구 사항이있는 사용자는 여전히 사용자 지정 CDS 아카이브를 만들 수 있습니다.

ARM 포트 수 감소

Java 12는 arm6432 비트 ARM 및 64 비트를 유지하면서 포트 와 관련된 모든 소스를 제거합니다 aarch64. 이 포트를 제거하면 기여자가 단일 64 비트 ARM 구현에 집중하고 두 개의 포트를 유지하는 데 따른 중복 작업을 제거 할 수 있습니다. 현재 두 개의 64 비트 ARM 포트가 JDK에 있습니다.

식 전환

Switch 표현식 switch은 명령문이나 표현식으로 사용할 수 있도록 명령문 을 확장하여 코딩을 단순화 합니다. 이를 통해 문과 식 모두 "전통적인"또는 "단순화 된"범위 지정 및 제어 흐름 동작을 사용할 수 있습니다. 이러한 변경으로 인해 "매일"코딩이 더 간단 해지고에서 패턴 일치 사용 방법을 준비 할 수 있습니다 switch.

Java 빌더가 패턴 일치를 지원하기 위해 이동함에 따라 Java switch명령문의 불규칙성  이 장애물이되었습니다. 여기에는 스위치 블록의 기본 제어 흐름 동작이 포함됩니다. 스위치 블록의 기본 범위 지정. 여기서 블록은 하나의 단일 범위로 처리됩니다. 문으로 만 작동하는 스위치. 현재 Java switch문장 의 디자인은 C ++와 같은 언어를 거의 따르며 기본적으로 폴 스루 의미론을 지원합니다. 이 제어 흐름은 저수준 코드를 작성하는 데 유용했습니다. 그러나 스위치가 더 높은 수준의 컨텍스트에서 사용되면 오류가 발생하기 쉬운 특성이 유연성을 능가하기 시작합니다.

기본 벤치 마크 제품군

JDK 12에는 플랫폼의 소스 코드에 추가 된 기본 마이크로 벤치 마크 제품군이 포함되어 있습니다. 목표는 개발자가 기존 벤치 마크를보다 쉽게 ​​실행하거나 새로운 벤치 마크를 구축 할 수 있도록하는 것입니다.

2014 년 7 월에 생성되어 2018 년 11 월 초에 업데이트 된 마이크로 벤치 마크 제품군 제안은 Java 및 기타 JVM 언어로 작성된 벤치 마크를 구축하기 위해 JMH (Java Microbenchmark Harness)에 의해 뒷받침되었습니다. 이 제품군은 단일 디렉토리에 JDK 소스 코드와 함께 배치되어 개발자가 새 벤치 마크를 쉽게 추가 할 수 있습니다.

새로운 JDK 기능에 대한 벤치 마크를 제공하거나 JDK의 모든 것을 포괄하는 완전한 벤치 마크 세트를 만드는 것은 목표가 아닙니다. 또한 벤치마킹 제품군은 일반 JDK 빌드에 필요하지 않지만 별도의 빌드 대상입니다. 

이 제안은 벤치 마크를 개발하고 요구 사항을 설명하는 방법을 설명하기 위해 wiki.openjdk.java.net에 새 페이지를 만들 것을 요청했습니다. 이러한 요구 사항은 코딩 표준, 재현 가능한 성능 및 문서를 준수하도록 요구합니다.

JDK 12 업데이트

계획은 JDK 12가 6 개월 안에 JDK 13이 성공하기 전에 두 가지 업데이트를받을 것을 요구합니다. JDK 12는 2017 년 9 월에 JDK 9와 함께 도입 된 Oracle의 6 개월 릴리스주기의 일부입니다. JDK 12는 몇 년의 지원이 계획된 장기 지원 릴리스 인 JDK 11과는 달리 기능 릴리스가 특징입니다.