Edited at

Java9勘所集

More than 1 year has passed since last update.


Java9

2017/09/21(※米時間)リリース。

「※米時間」って米米CLUB思い出しません?

今「米米CLUB」って一発変換できたぞなんだこれ。


変更一覧

JDK9 Features


多い


着眼点


  1. インパクト


    • ソースを弄らなくてもリリース済みのブツに影響を与えるようなヤツ

    • これからの設計、コーディングに影響を与えるようなヤツ



  2. 趣味


    • なんかVM近辺に影響してるヤツ




抽出


Jigsaw系のヤツ

もう一杯情報出てるので細かくいうことはないですが、あのパッケージ関連グラフ見ると「ウッ」ってなりますね


jshell

もう一杯(ry


String周りのヤツ


Compact Strings


Indify String Concatenation



  • "str" + "ing"のやり方をInvoke dynamic命令を使用するようにして改善

  • 過去もろもろあったStringBuffer→StringBuilderの経緯とかを気にしなくてもよくなるように

  • これからの時代、何でもかんでも「StringBuilderを使え!」は時代遅れと明確に

  • でも一応forとかwhile中だったり変数を含む文字列結合はBuilder使いましょうね


  • indyで実行時に向き先変えるんで、コンパイル済みのライブラリとかでも恩恵を受ける


    • 2017/11/06 modified

    • Java9によってindyで結合するようにコンパイルされたライブラリであれば、以降のバージョンで使用されてもその時々の向き先を使用するようになる

    • tsuyoshi_choさんから頂いた指摘で「indyを使うようにコンパイルされたライブラリ限定」であることを明示して修正




Store Interned Strings in CDS Archives


  • まず、java.lang.String#intern()ってメソッドがあるんですが、そいつが「今までに使用したStringをプールしてて、そこから引っ張ってくる」

  • このプールする場所の改良で、「別プロセスでも共有できるプールを用意してメモリを削減する」

  • ただし、64bit版かつG1GC利用時の場合のみ適用

  • メモリ削減が目標なので高速化とかはしない、というか少し遅くなってる模様、「<2-3%」だから「2-3%以内の劣化にとどまる」かしら

  • そもそもjava.lang.String#intern()が重い処理なので気にする内容ではない気がする


Deprecate the Applet API

アプレット? 奴なら死んだよ。


Unicode 8.0

何気なくバージョンアップされている内部表現。

Unicode7.0も居る。


Make G1 the Default Garbage Collector


  • もう一杯(ry

  • デフォルトのガーベッジコレクタがG1になります

  • ヒープを分割統治するので大容量ヒープの際にガーベッジコレクトに必要な時間が予測可能かつ小規模に

  • 有効なヒープサイズは6GBあたりからであるもよう

  • GCチューニング専門の人は「1度あたりのGC時間から逆算してリージョンサイズを決めること」って言ってた


UTF-8 Property Files


  • 地味にリソースバンドルにUTF-8が使えるようになる

  • ISO-8859-1とUTF-8で明示して使い分け可能


java.util.stream.Streamの処理が増える



  • Predicateを受け取って、条件を満たすまで続く無限Streamとか地味にうれしい

  • パラレルなFiles.lines()とかもうれしい


    • でもメモリマッピングしてかららしいのでやっぱりシーケンシャルにStream#read()することが多そう

    • そもそもパラレルにjava.ioのStream使ってうれしくなる状況とかほぼなさそう、分散系のファイルシステム、ブロードキャストぐらい?




Convenience Factory Methods for Collections

Set<String> s = Set.of("a", "b", "c");

作らなくてもよくなる。


Java-Level JVM Compiler Interface


  • JVMに対してマシンコードをぶち込めるとかいう触れてはいけない案件

  • 動的コンパイラを作成する際とかに使用するものらしく、Graalで使用するとか

  • JITの進み具合とか、現在コードがどういう風に展開されているかを取得するAPIが存在

  • さすがに起動時オプションを指定しないと適用されない