자바 언어에 대해 버전별로 정리하기를 미루고 미루다 정신을 차려보니 자바10 이 뙇.
먼저 Oracle 의 보도 자료 인용해 보면.
Oracle today announced the general availability of Java SE 10 (JDK 10). JDK 10 is a production-ready implementation of the Java SE 10 Platform Specification, as specified by JSR 383 in the Java Community Process. The first release in Oracle’s new six-month Java innovation cycle, Java SE 10 provides a number of new features, including local variable types, parallel full GC for G1, and experimental features such as the Java-Based JIT Compiler.
Java SE 10 was created in close collaboration with the OpenJDK Community, a diverse set of contributors whom have collaborated for more than ten years on an open-source implementation of the Java SE platform.
아.. 2018 년 03월 20일자로 Java SE 10 (JDK 10) 가 출시되었구나.
자료에서 소개하는 JDK10 의 주요 기능은 아래와 같이 설명 해놓았다.
- Local-variable type inference: enhances the Java language to extend type inference to declarations of local variables with initializers.
- Parallel Full GC for G1: improves G1 worst-case latencies by making the full GC parallel.
- Application Class-Data Sharing: optimizes startup time and footprint by extending the existing Class-Data Sharing ("CDS") feature to allow application classes to be placed in the shared archive.
- Experimental Java-Based JIT Compiler: enables the Java-based JIT compiler, Graal, to be used as an experimental JIT compiler on the Linux/x64 platform
Local-Variable Type Inference (로컬 변수 타입 추론), Parallel Full GC for G1 (병렬 처리 가비지콜렉션), Application Class-Data Sharing,
Experimental Java-Based JIT Compiler 정도를 소개하고 있으나.
바로 본론으로 들어가 OpenJDK(Open Java Development Kit) 정보를 기반으로 쭉 정리를 해본다. (자세한 내용은 제목을 클릭)
286: Local-Variable Type Inference
눈에띄는 새로운 점은 로컬변수를 선언할때 타입추론을 이용하여 명시적으로 타입선언 없이도 변수를 선언할수 있게 되었다.
ES5 의 var 변수와 lombok 의 var 처럼 variable 을 줄여 var 로 변수 선언이 가능하다.
다이아몬드 연산자에 아무 타입도 선언해주지 않거나 반복문 안에서 사용되는 var 변수의 초깃값을 주지 않는다면 Object 로 인식한다.
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
주의 해야할 점은 변수를 리터럴로 선언할때와 for 문 for each 구문에서만 사용이 가능하다.
for(var value : list) {
System.out.println(value);
}
for(var i=0; i<list.size(); i++) {
System.out.println(i);
}
296: Consolidate the JDK Forest into a Single Repository
개발을 할때 효율적이고 간결하게 하기위해 JDK 저장소들을 단일 저장소로 옮겼다고 하는데 재미없으니 패스.
304: Garbage-Collector Interface
가비지콜렉터 인터페이스를 도입하였다. 앞으로 여러 용도에 맞는 가비지 콜렉터가 등장하고 교체해서 쓸수 있을것이라고 한다.
이전 JDK의 G1 가비지 컬렉터는 Full GC를 피할수 있게끔 설계 되긴 했지만, 병행 컬렉터 작업에서 충분할 만큼 빠르게 메모리 반환을 하지 못한다면 Gull GC가 발생한다.
이전 JDK의 G1 가비지 컬렉터의 Full GC 구현은 단일 수래드의 mark-sweep-compact algorithm 을 사용한다.
여기서 mark-sweep-compact algorithm을 병렬화 하고 Young 과 Mixed 의 컬렉터 작업과 동일 수의 스레드를 사용 하려한다.
-XX:ParallelGCThreads 옵션으로 스레드의 수를 조정할 수 있으며 이는 Young 과 Mixed 의 스레드의 수에도 적용된다.
310: Application Class-Data Sharing
기존의 Class-Data Sharing(CDS) 기능을 확장해 애플리케이션 클래스를 공유 아카이브에 배치하고 서로 다른 자바 프로세스들이 공유할 수 있도록 개선함으로써, startup 시간을 단축시키고 메모리 사용량을 최적화 시켰습니다.
기존에 AppCDS 기능은 상업용으로 Oracle JDK에서만 제공되었으나, 오픈소스화 되어 Open JDK에도 사용할 수 있게 되었다.
GC 가 발생하기 위해 흔히 말하는 "stop-the-world" 가 발생하는데, GC를 수행하기 위해 GC를 실행하는 쓰레드를 제외하고 모든 쓰레드가 작업을 멈추는 것을 의미한다.
이전과 같이 모든 쓰레드들이 동시에 멈추지 않고 쓰레드를 개별로 멈출수 있게 되었고 VM safepoint 수행 없이도 개별 쓰레드에서 콜백 실행이 가능해졌다.
313: Remove the Native-Header Generation Tool (javah)
{JAVA_HOME}/bin 하위의 JDK 에서 제공해주던 많은 Tool 기능중 코드에 native 메소드 사용시 JNI 헤더를 생성해주는 툴이 삭제되었습니다.
삭제된 이유는 JDK8 부터 javac에서 JNI 헤더 파일 생성을 지원해주기 때문!
314: Additional Unicode Language-Tag Extensions
java.util.Locale 및 관련 API 들을 향상시켜서 BCP 47 언어 태그의 추가적인 유니코드를 확장 구현 하였다.
316: Heap Allocation on Alternative Memory Devices
HotSpot VM 이 사용자가 지정한 대체 메모리 장치 NVDIMM (비 휘발성 NAND 플래시 메모리) 또는 서로 다른 메모리장치를 사용해서 JVM Heap 영역의 메모리를 할당할 수 있게 되었다.
이를 위하여 -XX:AllocateHeapAt=<path> 옵션이 추가되었다.
317: Experimental Java-Based JIT Compiler
Java 기반 JIT 컴파일러인 GGraal을 Linux/ x64 플랫폼에서 실험적으로 JIT 컴파일러를 사용할 수 있다.
319: Root Certificates
JDK에서 최상위 인증 기관 Certification Authority (CA) 의 기본 세트를 제공한다.
Java도 root CA를 위한 저장소를 가지고 있다. ${JAVA_HOME}/lib/security 디렉터리 하위에 있는 cacerts 파일로, 단순한 keystore 이다.
기존에 OpenJDK 버전은 빈파일이 기본 셋팅이었지만, JDK 10부터는 Oracle JDK 버전에만 있던 root CA 목록이 기본으로 포함됩니다.
322: Time-Based Release Versioning
처음에 언급한 자바의 새로운 릴리즈 주기를 위한 버저닝(versioning) 포맷을 위한 변경사항.
새로 적용될 포맷은 [1-9][0-9]*((\.0)*\.[1-9][0-9]*)* 형식으로 $FEATURE.$INTERIM.$UPDATE.$PATCH 의미를 가집니다.
$FEATURE - 6개월 주기로 증가됩니다. 2018년 3월 버전은 JDK 10, 2018년 9월 버전은 JDK 11입니다.
$INTERIM - 6개월 주기 릴리즈 모델에서는 interim 릴리즈가 없어 항상 0 입니다.
$UPDATE - 보안 이슈, 버그 등의 수정이 업데이트된 버전을 나타내며 1달 단위로 증가됩니다. 2018년 4월 버전은 JDK 10.0.1, 5월 버전은 JDK 10.0.2 입니다.
$PATCH - 치명적인 이슈를 수정하여 배포할 때만 생기는 긴급 패치 버전입니다.
참고.
http://openjdk.java.net/projects/jdk/10/
http://itstory.tk/entry/Java-10-신규-기능특징-정리
'JAVA > 버전.' 카테고리의 다른 글
자바 버전별 신규기능, 특징 정리 - JDK9 (0) | 2018.07.02 |
---|---|
자바 버전별 특징 정리 - JDK1.4 (0) | 2016.04.29 |
댓글