NHN Cloud Meetup 編集部
Big things in JDK 10
2018.12.07
469
- (JEP 286)Local-variable type inference
- (JEP 310)Application Class-Data Sharing
- (JEP 314)Additional Unicode Language-Tag Extensions
- (JEP 322)Time-Based Release versioning
- (JEP 319)Root Certificates
- (JEP 307)Parallel Full GC for G1
- java.io.Reader
- java.util.{Collection}
- java.util.{Optional}
- java.util.stream.Collectors
JDK 10
2018/3/20に発表されたJDK10に追加された機能のすべては、下記で調べられます。
http://openjdk.java.net/projects/jdk/10/
約109個の新機能で構成されており、代表的なものとしてvarを使用したローカル変数型推論、Parallel GC、個別スレッドから分離されたStop-The-Worldなどがあります。
注目機能
代表的な新機能は以下の通りです。
(JEP 286)Local-variable type inference
varを使用して作成する変数の型を推論できる機能です。
開発者に最もインパクトのある機能です。変数を作成するとき、前方に変数の型を指定して後方から省略する方式(Diamond operator)で、java 1.7のバージョンで変更された場合、jdk 10ではvarを使ってローカル変数に型を明示する必要があります。
//Java 1.6 or earlier jvm version List <string> list = new ArrayList<string>(); //Java 1.7 or later jvm version List<string> list = new ArrayList<>(); //Java 10 var list = new ArrayList<string>(); var stream = list.stream();</string></string></string></string>
varはkeywordではなくreserved typeに分類されます。varという名前で変数名や関数名を作成できることを意味します。
(JEP 310)Application Class-Data Sharing
Class-Data Sharing(CDS)は、Java 5で導入されました。JVM起動時の性能を向上したり、複数のJVMが一つの物理デバイスまたは仮想アプライアンスで起動された場合、リソースに与えるの影響を軽減するために開発された機能です。
CDSはJVMで共通使用されるクラスを共有するリポジトリに位置させ、これを共有使用する方法で提供されます。(.jsaファイル)
CDSはJava process実行時にjvm optionでCDSの使用有無、共有ストレージの名前などを渡すことで使用できます。
$ java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar $ java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld
(JEP 314)Additional Unicode Language-Tag Extensions
java.util.Localeクラスの拡張版で、Java 9で提供されているBCP 47 Language tagにいくつか追加したバージョンです。
- cu(currency type)
- fw(first day of week)
- rg(region override)
- tz(time zone)
上記のタグをサポートするためのAPIも追加されました。
(JEP 322)Time-Based Release versioning
Java SE PlatformとJDKのバージョンを明示するための基準です。既存のversioningがJEP 223で定義された内容に適用されましたが、時間が経つにつれて、バージョン情報が非論理的に適用されるようになりました。
jdk 7のUpdate 55とUpdate 60のうち、どちらがより多くセキュリティ関連の修正が含まれているでしょうか?一般的に考えると、55より60の方が更新番号が大きいため、60により多くのパッチを含める必要があります。しかし、実際にはUpdate 55とUpdate 60どちらも同じ修正パッチを示します。次に「JDK 7 Update 60」、「1.7.0_60」「JDK 7u60」の違いは何でしょうか?お気づきでしょうが、同じパッチの別名です。
このような問題を解決し、新しいバージョンモデルである「Six-month release model」を適用するためのバージョン表記が必要になりました。
$FEATURE.$INTERIM.$UPDATE.$PATCH
- $ FEATURE – 機能番号を示す値です。機能の内容に関係なく、機能ごとに番号が1つ増加します。
- $ INTERIM – 下位互換性のあるバグ修正と機能強化の場合に増加するバージョンです。
- $ UPDATE – 新しい機能でセキュリティ上の問題、バグなどを修正する場合に増加するバージョンです。
- $ PATCH – 重要な問題を解決するため緊急で更新される場合に増加するバージョンです。
(上記の表記法はJEP223の表記と互換性があります)
(JEP 319)Root Certificates
基本的なRoot Certification Authority(CA)のセットを提供します。OpenJDKビルドとOracle JDKビルドの違いを減らすため、Oracle Java SEのルート証明書を、オープンソースで作ることを目的とした機能です。以前までは、cacertsと呼ばれるJDKのkeystoreに、セキュリティプロトコルに使用されるルート証明書のセットを入れられる場所が存在しましたが、空でしたし、ユーザーが直接文書化されたルート証明書のセットを満たさなければなりませんでした。
(JEP 307)Parallel Full GC for G1
Full GCを並列にして、G1のworst-case latencyを改善するための機能です。全体Collectionを回避するためjdk 9のGCはG1を基本としていますが、すぐにメモリを回収できない場合、全体のGCが下落する問題がありました。
G1はMark-Sweep-Compactアルゴリズムを使用してます。以前は単一スレッドでGCを実行した場合、jdk 10から並列にMark-Sweep-Compactを実行します。このとき、スレッドの数は、基本的にYoung and Mixed Collectionのスレッドと同じで、必要な場合には-XX:ParallelGCThreadsオプションで調節可能です。しかし、このオプションを使用する場合、Young and Mixed Collectionのスレッド数にも影響を与えるので注意が必要です。
新しいAPI
標準クラスライブラリのAPIが73個、追加されました。代表的なものは以下の通りです。
java.io.Reader
long transferTo(Writer);
reads all characters from this reader and writes the characters to the given writer in the order that they are read.
リーダーから文字を読み取り、読み取られた順序で指定したライターに文字を書き込みます。
java.util.{Collection}
/** *@Collection List, Map, Set */ static Collection copyOf(Collection);
These return an unmodifiable List, Map or Set containing the elements of the given Collection, in its iteration order.
指定されたCollectionの要素を含む変更不可能なList、Map、またはSetを繰り返し順に返します。
java.util.{Optional}
/** *@Optional Optional, OptionalDouble, OptionalInt, OptionalLong */ Throwable orElseThrow();
New method which essentially does the same as get(), i.e. if the Optional holds a value it is returned. Otherwise, a NoSuchElementException is thrown.
基本的にget()と同じことをする、つまりOptionalが値を保持している場合はそれが返される新しいメソッド。 そうでない場合は、NoSuchElementExceptionが投げられます。
java.util.stream.Collectors
Collector toUnmodifiableList(); Collector toUnmodifiableSet(); Collector toUnmodifiableMap(Function, Function); Collector toUnmodifiableMap(Function, Function, BinaryOperator);
These four new methods return Collectors that accumulate the input elements into the appropriate unmodifiable collection.
これら4つの新しいメソッドは、入力要素を適切な変更不可能なCollectionをCollectorに返します。