Java
ポエム
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が存在
  • さすがに起動時オプションを指定しないと適用されない