NHN Cloud NHN Cloud Meetup!

Big things in JDK 10

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&lt;&gt;();

//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に返します。

参照

NHN Cloud Meetup 編集部

NHN Cloudの技術ナレッジやお得なイベント情報を発信していきます
pagetop