Java10 Releases notes

2020-08-26

아주 오랜 기간 블로그 작성을 못하고 있었다.
바빴……다기 보다 게을러 져서 ㅠㅠ
최근에 진행한 프로젝트까지 Java8을 사용했었다. 정신을 차리고 보니 벌써 Java14가 Release된 걸 보면서 공부를 너무 게을리 하고있구나…. 라는 생각에 정리를 해보고자 한다.

Index

JEP 286: Local-Variable Type Inference

로컬 변수의 유형을 추론 할 수 있다. 변수는 선언시 당연하게 타입을 지정해야 했다. Java10에서는 로컬 변수 선언을 var를 이용하여 선언이 가능하며 컴파일 시 타입을 추론 할 수 있다. 개인적으론 이번 Release에서 가장 많이 사용 할 것 같다.

1
2
var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>

초기화 되어있는 로컬 변수, 반복문에서 로컬 선언 된 로컬 변수로 제한됩니다.

1
2
3
4
5
6
7
8
var strA = "a";
var strB = "b";
var strC = "c";
var strs = Arrays.asList(strA, strB, strC, "d");

for (var str : strs) {
....
}

Java는 이미 RHS(lambda formals, generic method type arguments, diamond)에서 이미 타입 추론을 하고 있기 때문에 이러한 표션식의 LHS에서 사용하려는 시도가 실패 할 위험이 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Main.java:81: error: cannot infer type for local
variable x
var x;
^
(cannot use 'val' on variable without initializer)

Main.java:82: error: cannot infer type for local
variable f
var f = () -> { };
^
(lambda expression needs an explicit target-type)

Main.java:83: error: cannot infer type for local
variable g
var g = null;
^
(variable initializer is 'null')

Main.java:84: error: cannot infer type for local
variable c
var c = l();
^
(inferred type is non denotable)

Main.java:195: error: cannot infer type for local variable m
var m = this::l;
^
(method reference needs an explicit target-type)

Main.java:199: error: cannot infer type for local variable k
var k = { 1 , 2 };
^
(array initializer needs an explicit target-type)

JEP 296: Consolidate the JDK Forest into a Single Repository

JDK 포리스트의 수많은 리포지토리를 단일 리포지토리로 결합하여 개발을 단순화하고 간소화합니다.

JEP 304: Garbage Collector Interface

깨끗한 GC (가비지 수집기) 인터페이스를 도입하여 다양한 가비지 수집기의 소스 코드 격리를 개선합니다.

JEP 307: Parallel Full GC for G1

전체 GC를 병렬로 만들어 G1 최악의 지연 시간을 개선합니다.
G1 가비지 수집기는 전체 수집을 방지하도록 설계되었지만 동시 수집이 메모리를 충분히 빠르게 회수 할 수없는 경우 전체 GC 폴 백이 발생합니다. G1에 대한 전체 GC의 현재 구현은 단일 스레드 mark-sweep-compact 알고리즘을 사용합니다. mark-sweep-compact 알고리즘을 병렬화하고 Young 및 Mixed 컬렉션과 동일한 수의 스레드를 사용하려고합니다. 스레드 수는 -XX:ParallelGCThreads옵션 으로 제어 할 수 있지만 이는 Young 및 Mixed 컬렉션에 사용되는 스레드 수에도 영향을줍니다.

JEP 310: Application Class-Data Sharing

시작 및 풋 프린트를 개선하려면 기존 Class-Data Sharing(“CDS”) 기능을 확장하여 애플리케이션 클래스를 공유 아카이브에 배치 할 수 있습니다.

JEP 312: Thread-Local Handshakes

전역 VM safepoint를 수행하지 않고 스레드에서 콜백을 실행하는 방법을 소개합니다. 모든 스레드가 아닌 개별 스레드를 중지하는 것이 가능하고 저렴하게 만드십시오.

JEP 313: Remove the Native-Header Generation Tool (javah)

이 도구는 JDK 8 ( JDK-7150368 )에 추가 된 javac의 우수한 기능으로 대체되었습니다. 이 기능은 Java 소스 코드가 컴파일 될 때 원시 헤더 파일을 작성하는 기능을 제공하므로 javah는 제거 되었습니다.

JEP 314: Additional Unicode Language-Tag Extensions

java.util.LocaleBCP 47 언어 태그의 추가 유니 코드 확장을 구현하도록 관련 API를 개선 합니다.
지원 BCP 47 개 언어 태그는 초기 하였다 자바 SE 7에 추가 된 캘린더와 숫자로 제한 유니 코드 로케일 확장에 대한 지원. 이 JEP는 관련 JDK 클래스에서 최신 LDML 사양에 지정된 더 많은 확장을 구현합니다.

JEP 316: Heap Allocation on Alternative Memory Devices

사용자가 지정한 NV-DIMM과 같은 대체 메모리 장치에 Java 개체 힙을 할당하도록 HotSpot VM을 활성화합니다.

JEP 317: Experimental Java-Based JIT Compiler

Linux / x64 플랫폼에서 실험적인 JIT 컴파일러로 사용할 Java 기반 JIT 컴파일러 Graal을 활성화합니다.
Graal을 Linux / x64 플랫폼부터 실험적인 JIT 컴파일러로 사용하도록 설정합니다. Graal은 JDK 9에 도입 된 JVMCI (JVM 컴파일러 인터페이스)를 사용합니다. Graal은 이미 JDK에 있으므로 실험적인 JIT로 활성화하는 것은 주로 테스트 및 디버깅 작업이 될 것입니다.
Graal을 JIT 컴파일러로 활성화하려면 java명령 줄 에서 다음 옵션을 사용하십시오 .

1
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

JEP 319: Root Certificates

JDK에서 기본 루트 인증 기관 (CA) 인증서 세트를 제공하십시오.
OpenJDK 빌드를 개발자에게 더 매력적으로 만들고 이러한 빌드와 Oracle JDK 빌드 간의 차이를 줄이기 위해 Oracle Java SE Root CA 프로그램에서 루트 인증서를 오픈 소스합니다.
cacerts스토어는 오라클의 자바 SE 루트 CA 프로그램의 CA에서 발급 루트 인증서 세트로 채워집니다. 전제 조건으로 각 CA는 Oracle에 인증서를 오픈 소스 할 수있는 권한을 부여하기 위해 OCA (Oracle Contributor Agreement) 또는 이와 동등한 계약에 서명해야합니다 . 다음은 필수 계약에 서명 한 CA와 포함될 루트 인증서 (고유 이름으로 식별) 목록입니다. 이 목록에는 현재 Oracle Java SE Root CA 프로그램의 구성원 인 CA 대부분이 포함됩니다. 계약에 서명하지 않은 사람은 현재 포함되지 않습니다. 처리하는 데 더 오래 걸리는 항목은 다음 릴리스에 포함됩니다.

JEP 322: Time-Based Release Versioning

현재 및 미래의 시간 기반 릴리스 모델에 대해 Java SE 플랫폼 및 JDK의 버전 문자열 체계와 관련 버전 관리 정보를 수정합니다.
버전 번호 , $VNUM기간 문자 (U + 002E)에 의해 분리 된 소자 비어 시퀀스이다. 요소는 0이거나 선행 0이없는 부호없는 정수입니다. 버전 번호의 마지막 요소는 0이 아니어야합니다. 요소가 증가하면 모든 후속 요소가 제거됩니다. 형식은 다음과 같습니다.

1
2
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*
`