JDK 11リリース記念：今知っておくべきJDK 11の重要ポイントの個人メモ

### はじめに
10/9に日本オラクルで開催されたJJUG(Japan Java User Group：日本Javaユーザ会)のナイトセミナー：[JDK 11リリース記念：今知っておくべきJDK 11の重要ポイント](https://jjug.doorkeeper.jp/events/81150)へ行ってきたので、メモ。

[togetterのまとめ](https://togetter.com/li/1275036)

### JDK: 新しいリリースモデル解説
日本オラクルの[伊藤さん](https://twitter.com/itakash)による新しいリリースモデルの解説

発表の前に、Javaが有償でないと使えないという噂が広まっているので、Javaが無償で使えることをアピールするページ「Java is Still Free」が公開され、日本では有志が集まって翻訳し、10/9に公開されたことがアナウンスされました。

[日本語版の Java is Still Free.](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)

----

資料：[JDK: 新しいリリースモデル解説（ver.2.1）](https://www.slideshare.net/oracle4engineer/jdk-ver21)


9/25にJava 11がリリースされた。
いつもの[オラクルのページ](https://www.oracle.com/technetwork/jp/java/javase/downloads/index.html)からダウンロードできるが、ライセンスが変わったことをハイライトしてある。

これまではOpenJDKがソースコードを提供し、オラクルがバイナリをOracle JDKとして提供していた。
この時のOracle JDKの無償サポートのライセンスはBCL。

これからはソースコードはコミュニティが開発（これは前と同じ）し、オラクルがバイナリを生成し、OpenJDKとしてリリース。Java 11からの無償サポートのライセンスはGPL。
Oracle JDKは基本的に商用だが、**社内利用や個人でのテストや開発、デモには使える**(原文はInternal use)。

Java 8の無償サポートは2020年、有償は2025年まで。
Java 11以降のLTS(ロングタームサポート)は最低8年。
無償サポートは今の所、次のバージョンがリリースされるまでの半年のみだが、もしかしたらLTSやるかも？（明言はしていない）

リリースは半年ごとだが、バグや脆弱性対策で定期的にマイナーバージョンが上がっている。ただし、無償サポートでの複数バージョンのサポートはされない。

非推奨APIの告知は従来と同じ運用。1年位で削除される。

有償サポートライセンスの対象はJavaが実行されうるすべての端末。

 - 1デスクトップ（=1ユーザ）だと年間3,600円
 - 1サーバにつき年間36,000円。

今のところサーバは個人で契約できないが、契約できるよう準備中。

### Java 11のサポートとVM機能の解説
[久保田さん](https://twitter.com/sugarlife)によるJava 11のサポートとVM機能の解説。

資料[Introduction to Java 11: Support and JVM Features](https://www.slideshare.net/YujiKubota/introduction-to-java-11-support-and-jvm-features)

#### サポートについて
そもそもサポートには以下の3つがある。

- 開発サポート
 - バグや脆弱性対応。維持目的。Open JDKコミュニティが主。IBMとかTCKをパスした企業もやってる。

- 配信サポート　
 - 機能追加。OracleとかRed Hatなどの企業がやっている。Open JDKはやっていない。

- 問い合わせサポート
 - コンサルティング。バイナリを提供している企業が主。

Open JDKのリード役はOracle。
開発サポートはやる（今の所3年だが、Java SE6ではRed Hatが延長サポートした事例があるので伸びるかも）。ただし配信・問い合わせサポートはしない。

Open JDKは商用利用できる品質。
Oracle JDKからOpen JDKへの移行は証明書周りがネック（ライセンスの問題でOracle JDKにしか入れられないものもあったため）。

Java 8からJava 11への移行の手間はOpen JDKもOracle JDKも同じ。

Abopt Open JDKはリリースしてからテストするので、マイナーバージョンアップも1週間位遅れる。0day攻撃が怖ければOracle Open JDKを使うべき。
JREは実質なくなったがLinuxディストリビューションのは引き続き使える。
コンテナとして使う場合はサイズを削減する[jlink](https://docs.oracle.com/en/java/javase/11/tools/jlink.html)がある、

Java FXは同梱されなくなっただけでOpen JDKでも使える。というか、もともとOpen JDKでは同梱していない。

一応Java 8の有償サポート期間中に次のLTSのJava 17がリリースされるので、Java 8から直接Java 17に移行することもできる。

LTSでないバージョンは、個人で使う以外は無視しても良いが、機能のキャッチアップはした方が良い。

どのバージョンを使うかは予算と要件に合わせて……

- 無償サポートだと移行期間がないので、有償サポートを使うのもあり。
- 社内でJavaに詳しい人材を育てる。

#### VM機能について
この辺はSlideShareの資料を見たほうがわかりやすい。

##### JEP330 javacでコンパイルしなくてもソースを実行できる

`java XXX.java` といった感じで直接実行できる。
ただし、
1. 1つのjavaファイルで完結していること
2. メインメソッドがあること

クラス名とファイル名が違うのはok。

また、シェルのように`./Xxx.java`のようにも実行可能。
実行するjavaとバージョンをコマンドの先頭に記載する。

内部的にはsource-launcherが起動し、コンパイルしてインメモリに展開いてmainを実行する。

##### JEP328  フライトレコーダのオープンソース
ボトルネック調査。メモリやプロセス情報、GC状況、メモリ設定、などなど。
可視化には`JDK Mission Control`が必要。
また、Oracle JDKからオプションの構成が変わっているので注意

##### JEP318  イプシロンGC
メモリ回収しないGC。メモリ割り当てを超えるとOutOfMemoryがおこる。
メモリ回収による負荷を回避したい時に有用　⇒　研究とか測定に使うべき
一応商用にも使えなくはないが、厳密なメモリ計算や、ライフサイクルの管理が必要。

##### JEP333 Pauseless GC
従来のGCはヒープサイズとかによってSTW(stop-the-world)時間が比例していたが、Root Scanに限定したり、並列化などによって改善されたGC。
ただし64bitでかつLinux限定。Linux以外のサポートの可能性はあるが、32bitの対応はほぼなさそう。
今のところ仕様変更がどんどん入っているので仕様変更の追跡が必須。

### Java 11のAPIの変更点の解説
LINE 福岡の[きしださん](https://twitter.com/sugarlife)によるJava 11のAPIの変更点の解説。
スライドは公開されているのか不明。

#### JEP181 ネストクラスのアクセス制御
Javaのアクセス制御には、public～privateの4つがあるが、ネストクラスは特殊だった。
⇒コンパイルするとOuter$innerみたいな感じでネスト情報が消えていた。

`nest mate`の導入により、アクセス制御が正しくできるようになった。
また`nest mate`かチェックするAPIも追加された。

#### JEP309 constant dynamic(condy)
クラスファイルの拡張。定数の自由度が高まる。遅延実行ができる。
ここでいう定数は、static finalフィールドではなく、class-file上の定数。

ゆくゆくはstatic finalなフィールドにも対応するらしい。

#### JEP320 Java EEと CORBA削除
Java EE系は代わりにMavenのAPI Artifactで対応可能。
Java SEとJava EEの開発速度の速さの違いや保守の観点、またJava EEがJakrta EEで管理ということも関係しているらしい。

CORBAについては特に説明はありませんでした。今仕事で使ってるんだけどなぁ（泣）。

#### JEP321 http connection
Java 9から入ったがモダンなAPIで、HTTP2やReactive対応。
Java 11から正式版としてはいった。

Builderパターンで設定を追加していくイメージ。

#### JEP323 ラムダでvarを使える
まぁ、そのまんま。

#### 追加されたAPI
この辺は、デモを見てたのでほとんどメモ取れてないです。:ghost:

##### String
- repeat
- isblank スペースでもtrueになる
- strip   trimの全角対応版
- lines   行数を取得できる
- Character.tostring `int`にキャストする必要がなくなった

##### I/O
- Files
- Null I/O
- Path.of

##### Util
- Collection.toarray(intfunction)
- Predicate.not(条件式)
- Optional.isEmpty

##### 削除されたAPI
- Thread.destroyとThread.stop(x)が削除
- policyが削除

##### 変更されたAPI
- ArrayIndexOutOfBoundsException エラーメッセージの改善
- 新年号対応（平成３１年５月１日がエラーになる）

##### バグ修正
- varまわり `var = List.of("aaa",1)`がdebug情報付きの場合に落ちていた
- string+=まわり `s[i++]+="a"`のようなコードの挙動がおかしかった。文字列の連結に`invokeDynamic`を導入したときのバグ
- timsortまわり 要素が67,000,000件以上あったときにArrayIndexOutOfBoundsExceptionになることがあった


##### 今後追加予定の機能
- Raw String Literals
バッククォートで囲むとエスケープしなくてもOK!ただし変数の埋め込みはできないっぽい

ちなみに、エクスペリメンタルな機能はデフォルトでは使えないので、明示的にオプションを指定する必要がある。
→なので知らぬ間に使われることはない。

### 最後に
これからはナイトセミナー、Java One報告会、JJUG CCCとイベントが続くのでぜひ盛り上げていきましょう。

------
2018/10/23　追記：
きしださんの発表資料が、2018 Oracle Code Oneで発表された内容とだいたい同じなためリンクを貼ります。
[Learn JDK11 with JShell (23 Oct. 2018 Oracle Code One)](https://qiita.com/nowokay/items/80e8ccd50f6749846dd6)