본문 바로가기
Language & Library/JAVA

Java 10 버전 특징

by 댓츠굿 2018. 12. 2.



java 10


오라클이 3월 20일 Java SE 10(JDK 10) GA(general availability)를 발표했다.


주요 특징

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



특징

ㆍvar 키워드를 이용한 로컬변수 선언

Unmodifiable Collection 향상

병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상

개별 쓰레드로 분리된 Stop-The-World

루트 CA 목록 등 추가

JDK의 Repository가 하나로 통합

JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능

실험적인 Java 기반의 JIT(Just In Time) 컴파일러 추가

Deprecated API Java SE 10에서 모두 삭제


286: Local Variable Type Inference


var 키워드를 이용하여 로컬변수를 선언할 수 있고, 컴파일 할 때 (컴파일러가) value type을 가지고 변수 타입을 추론한다.


Java10 이전

HashMap<String, String> content = new HashMap<>();

List<String> list = new ArrayList<String>();

Java10 이후

var content = new HashMap<String, String>();

var list = new ArrayList<String>(); 

또한 변수에 함수를 담을 수 있다.

public static void main(String[] args) {

var val = countNumbers();

}


public static List countNumbers() {

var numbers = List.of(1, 2, 3, 4, 5); for (var number : numbers) {     System.out.println(number); }

return numbers;

}


Unmodifiable Collection Enhancements


Java 10은 전혀 수정할 수 없는 집합을 만들기 위해 두 개의 새로운 API를 추가하였다.
첫 번째 API에서는 다음 복사본을 추가하여 수정할 수 없는 복사본을 컬렉션으로 만들 수 있다.

...

11 var numbers = new ArrayList<>( List.of("a", "b", "c") ); 12 var unmodifiable = List.copyOf(numbers); 13 unmodifiable = Collections.unmodifiableList(numbers); 14 15 System.out.println(unmodifiable.get(0)); 16 unmodifiable.set(0, "d"); 17 System.out.println(unmodifiable.get(0));


 결과:

       a

Exception in thread "main" java.lang.UnsupportedOperationException

at java.base/java.util.Collections$UnmodifiableList.set(Collections.java:1310)

at Test.main(Test.java:16)



두 번째 API는 Streampackage의 Collectors 클래스에 세 가지 새로운 방법을 추가한다. tomodifableList, tomodifableSet, UnmodifableMap을 사용하여 수정할 수 없는 컬렉션으로 직접 스트리밍할 수 있다.

...

11 var numbers = new ArrayList<>( List.of("a", "b", "c") ); 12 var unmodifiable = List.copyOf(numbers); 13 var result = Arrays.asList(numbers) 14   .stream() 15   .collect(Collectors.toUnmodifiableList()); 16 unmodifiable.set(0, "e"); 17 18 System.out.println( unmodifiable.get(0) );


결과:

      Exception in thread "main" java.lang.UnsupportedOperationException

  at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)

  at java.base/java.util.ImmutableCollections$AbstractImmutableList.set(ImmutableCollections.java:109)

  at Test.main(Test.java:16)




296: Consolidate the JDK Forest into a Single Repository


개발을 할때 효율적이고 간결하게 하기위해 JDK 저장소들을 단일 저장소로 옮겼다.




304: Garbage-Collector Interface


가비지콜렉터 인터페이스를 도입하였다. 앞으로 여러 용도에 맞는 가비지 콜렉터가 등장하고 교체해서 쓸수 있을것이라고 한다.




307: Parallel Full GC for G1


이전 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에도 사용할 수 있게 되었다.




312: Thread-Local Handshakes


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 - 치명적인 이슈를 수정하여 배포할 때만 생기는 긴급 패치 버전입니다.





참조: https://blogs.oracle.com/java-platform-group/introducing-java-se-10

       http://itstory.tk/entry/Java-10-신규-기능특징-정리

       https://dzone.com/articles/whats-new-in-java-10





반응형