2018年9月末には、Java11 がリリースされる予定です。

 

Java11で対応される予定の機能は、以下のサイトで確認ができます。(JEPs targeted to JDK 11, so farの項を参照)

http://openjdk.java.net/projects/jdk/11/

 

上記を見てみるとOracle Java7から利用できていたプロファイリングとイベント収集フレームワークであるMission Control(JMC) / Java Flight Recorder(JFR)がOpenJDKにも含まれるようです。

http://openjdk.java.net/jeps/328

 

■Mission Control(JMC) と Java Flight Recorder(JFR)とは
Java Flight Recorderは、もともとOracle JDKに組み込まれているプロファイリングとイベント収集フレームワークで、Java Virtual Machine (JVM) とJavaアプリケーションがどのように動作しているかについての詳細な低レベル情報を収集することができます。


Java Mission Controlは、Java Flight Recorderによって収集されたデータを分析を可能にする高度なツール・セットで、Javaアプリケーションからデータを収集し分析することを可能にします。
(例)ヒープ、CPU使用状況、スレッド数といった一般的な情報からJITコンパイルの状況、ホット・メソッド、ロック・インスタンスなどの細かい情報

 

さっくり言うと
・Java Mission Control→GUIのリアルタイムモニタリングツール

・Java Flight Recorder→Javaアプリケーションの動作をレコーディングするプロファイラ

となります。

 

Java Mission Control、Java Flight Recorderの使い方については、以下のサイトが参考になると思います。

https://qiita.com/sahn/items/952f8c1fdc463fa372b4


 

2018年9月にリリース予定のJava 11以降は、「Oracle JDKは有償」(Oracle社と有償サポート契約を結んだユーザーにのみ提供)されるようになるもようです。

また、Oracle Java SEサポート・ロードマップを見てみるとサポート期間は以下の通り。
思いっきり短いです。。。

- Java 8 → 2019年1月
- Java 9 → 2018年3月
- Java 10 → 2018年9月

一方、Oracle Java SE 11からは長期サポート(LTS)を開始され、
3年間パッチを出し続けるバージョンを並行してリリースされるようです。

つまり、現在動いているJavaのアプリケーションをセキュアなビジネスで使いたいのであれば、ちゃんと予算を確保して行かなければならなくなります。
では、お金がだせないような個人、中小企業はJavaを使えないかというとそうではありません。OpenJDKを使えばよいのです!
ただし、OpenJDKのサポート期間は、原則として次のメジャーリリースが行われるまで(だいたい6ヵ月)とのこと。

■「Oracle JDK」と「OpenJDK」の比較について
https://www.ossnews.jp/compare/Oracle_JDK/OpenJDK
https://qiita.com/ukiuni@github/items/5bb523c31bb4b4f9a278

上記サイトを参考にさせて頂きますと、


Java 11から「Oracle JDK」と同じ機能と品質を備えたオープンソース実装「OpenJDK」がリリースされ
バイナリが無償で提供される予定となっています。

また、ほぼ同じコードで書かれており、機能的な差異は見れれないようです。

性能面で言うと、ARM上においては差異が認められ、OpenJDKのほうが良い結果がみられているようです。

前回(ちょうど一年くらい前)にJava 9の内容について触れました。
Java 9の新機能として、Project Jigsaw、JShell、Process API、Segmented Code Cache、HTTP/2およびWebSocket対応が有名ですが、

メジャーではないけれども知っておいた方がよい機能について記述します。

■JEP 226: UTF-8 Properties Files
プロパティファイルにUTF-8エンコードが利用できるようになりました。
Java 8まではnative2asciiで、UTF-8へ置き換えする必要がありましたが、
Java 9からは入力した文字をそのまま扱えるようになりなりました。
なお、この変更に伴い変換ツールのnative2asciiが提供されなくなりました。

■JEP 282: jlink: The Java Linker
jlinkという新しいツールを使うと、一連のユーザーが提供するモジュールとランタイムの依存関係をアセンブルし、アプリケーション実行に必要なJDK 9モジュールのみを含む、カスタムランタイムイメージに最適化することができるとのこと。(Oracle blogsより引用)
これにより、JVMがない環境でもにJavaアプリケーションと実行環境のセットを配布することができるようになります。

■JEP 254: Compact Strings
これまで Stringクラス、StringBuilderクラスの内部では、文字列をUTF-16でエンコードしてchar配列で保持していました。
つまり、1文字あたり2バイト分のメモリを使用していたため、1バイトで表せるLATIN1の場合、0x00の分無駄が生じていました。
Java 9では内部表現を変更され文字列がLATIN1のみで構成されるときは1文字を1バイトへ変更となりました。

(イメージ)
Java 8以前:'a' → 0x00 0x61の2バイト
Java 9:'a' → 0x61の1バイト

■Stream処理の改善
takeWhile/dropWhileメソッド

(1)takeWhileは条件に一致している間のみ処理を実施し、条件に合わなくなるとそれ以降は処理を行ない。
(2)dropWhileは条件に一致する間のみ処理をせず、条件に一致しないデータが現れて以降、処理をする。

// (1)の例:1,2が出力される
Stream.of(1,2,3,4,5).takeWhile( i -> {
  if(i < 3) {
    return true;
  }
  else{
    return false;
  }
}).forEach(System.out::println);

// (2)の例: 3,4,5が出力される
Stream.of(1,2,3,4,5).dropWhile( i -> {
  if(i < 3) {
    return true;
  }
  else{
    return false;
  }
}).forEach(System.out::println);

 

今後も引き続きJava 9、Java 10の新機能について説明してきます!