ラベル Java 14 の投稿を表示しています。 すべての投稿を表示
ラベル Java 14 の投稿を表示しています。 すべての投稿を表示

2020/04/18

Java 14 の新機能 (10) - JEP 370: Foreign-Memory Access API (Incubator)

JEP 370: Foreign-Memory Access API (Incubator)

Foreign-Memory Access API とは?

Java プログラムにおいて使用するメモリは、通常ヒープ領域の中から確保されます。ヒープはガーベジコレクタの管理下にあり、オブジェクトの生成に応じて必要なメモリがヒープから割り当てられ、オブジェクトが消滅したメモリはガーベジコレクタによって識別されて未使用ヒープに戻ります。

しかし Java でも、オフヒープメモリ(Off-Heap-Memory) または外部メモリ (Foreign-Memory) と呼ばれる、ガーベジコレクタの管理外のメモリを使用する需要はあり、以前からオフヒープメモリアクセスを行う実装は存在していました。大きく分けて3つの方法があります。

2020/04/17

Java 14 の新機能 (9) - JEP 368: Text Blocks (Second Preview)

JEP 368: Text Blocks (Second Preview)

Java 13 での JEP 355: Text Blocks (Preview) を受けて、仕様を修正しての Second Preview です。まだ Preview レベルなので、明示的に有効化しないと使えません。

テキストブロックとは?

テキストブロックとは、複数行に渡る文字列リテラルの記法です。他の言語では、here document とか here string とか raw string とか verbatim とか呼ばれている記法です。

Java 14 の新機能 (8) - JEP 361: Switch Expressions (Standard)

JEP 361: Switch Expressions (Standard)

switch 式が Preview から標準になりました。

Java 14 の新機能 (7) - JEP 359: Records (Preview)

JEP 359: Records (Preview)

record とは

Java 14 から、データを保持するための immutable なクラスを定義するための新しい構文が追加されました。それが record です。
データを保持するために、以下のような性質を持つクラスを定義することは、Java では頻繁にあります。

  • immutable であること
    • コンストラクタでフィールドを全て設定し、フィールドは final
  • 値を取り出すメソッドを持っていること
  • final クラスであること
  • hashCode, equals, toString が適切に定義されていること
とても頻繁に定義するので、IDE で自動生成したり、Lombok のような特殊な仕組みを使ったりしていました。
これからは、record がサポートしてくれます。

JDK 14.0.1 出ました

まだ Java 14 の紹介記事が書き終わってませんが、JDK 14.0.1 が出ました。Oracle JDK も OpenJDK も出ています。

2020/04/14

Java 14 の新機能 (6) - JEP 358: Helpful NullPointerExceptions

JEP 358: Helpful NullPointerExceptions

NullPointerException 発生時のエラーメッセージが詳しくなりました。

使い方

今のところ、デフォルトでは無効になっていて、VM 引数を付けて有効にする必要があります。-XX:+ShowCodeDetailsInExceptionMessages を付けてください。

Java 14 の新機能 (5) - JEP 352: Non-Volatile Mapped Byte Buffers

JEP 352: Non-Volatile Mapped Byte Buffers

MappedByteBuffer は java.nio でメモリマップドI/Oを行うときに使う ByteBuffer です。その MappedByteBuffer が不揮発メモリ (Non-Volatile Memory/NVM) 向けに改良されました。
おそらく、Filesystem DAX を使って mmap で NVDIMM に直接アクセスするシチュエーションを考慮したものだと思います。

2020/04/12

Java 14 の新機能 (4) - JEP 349: JFR Event Streaming

JEP 349: JFR Event Streaming

JDK Flight Recorder という機能が OpenJDK 11 から含まれています。JRockit 由来の機能で、VM 内部のイベントをファイルに記録し、VM の実行中でも終了後でも、Mission Control や JFR API を使ったプログラムでプロファイリング的に解析できるというものです。

動作中の VM に対しても使えるのですが、記録されたイベントを走査していく形の API なので、リアルタイム監視目的にはちょっと使いづらい API でした。
そこにきて今回、ストリーム形式の API が追加され、イベントドリブンな形で JFR イベントにアクセスできるようになりました。インプロセスでの JFR イベント処理はもちろん、記録されたファイルを解析するときも、どちらも EventStream という統一されたインターフェースでアクセスできます。

2020/04/11

Java 14 の新機能 (3) - JEP 345: NUMA-Aware Memory Allocation for G1

JEP 345: NUMA-Aware Memory Allocation for G1

NUMA とは、Non-Uniform Memory Access の略で、マルチプロセッサのコンピュータアーキテクチャの1形態です。CPU コアにメインメモリのコントローラが内包されており、メインメモリが従属する CPU コアが決まっています。CPU コアは、自分の持っているメモリ (ローカルメモリ) には高速にアクセスできますが、他コアのメモリ (リモートメモリ) へはコア間接続 (インターコネクト) 経由でアクセスするため、遅くなります。
対義語は UMA (Uniform Memory Access) で、全コアがコア外のメモリコントローラ経由でメインメモリにアクセスするようになっていて、どのコアもどのメモリへも均一のアクセス速度を持つ形態です。
Intel では Core i7 や Xeon の Nehalem 世代以降、NUMA になっています。AMD だと Opteron は NUMA です。Ryzen は NUMA も UMA も出来るというびっくり仕様。

Java VM においては、Parallel GC では以前から NUMA が考慮されていましたが、他の GC では考慮されていませんでした。今回、G1 GC で NUMA を考慮するようになりました。
具体的にはまず、各 NUMA ノードに均一にヒープを確保します。その上で、新しいオブジェクトを割り当てるときには、それを行うスレッドに紐付く NUMA ノード上のメモリを優先的に割り当てます。生存期間の短いオブジェクトは、割り当てたスレッドからのアクセスが断然多いということが経験上分かっているため、効率が良くなります。
大きいオブジェクトや古い世代のオブジェクトは、この限りではなくなります。

有効化するには、-XX:+UseNUMA オプションを付けて起動します。

2020/04/10

Java 14 の新機能 (2) - JEP 343: Packaging Tool (Incubator)

JEP 343: Packaging Tool (Incubator)

自己完結型 (つまり、Java Runtime を含んだ形) で Java アプリケーションをパッケージ化するツールです。jpackage というコマンドになっています。

Java 14 の新機能 (1) - JEP 305: Pattern Matching for instanceof (Preview)

JEP 305: Pattern Matching for instanceof (Preview)

instanceof 演算子にパターンマッチング機能が追加されました。いわゆる instanceof-and-cast idiom を書かずに済むようにするための文法拡張です。Preview なので、明示的に Preview レベルの機能を有効にしてあげないと使えません。

Java 14 リリース

Java 14 が出ましたね。
https://jdk.java.net/14/
https://openjdk.java.net/projects/jdk/14/

早速 Pleiades Eclipse も Java 14 入りのバージョンが用意されました。
Pleiades Eclipse 2020-03 リリース 〜 Java 14 新機能を試そう!

余談ですが、おじさんは jdk14 って書かれると、jdk 1.4 を思い出しちゃいます。

さて、新機能は以下の通りです。次の記事から、順番に紹介していきたいと思います。