Más contenido relacionado
La actualidad más candente (20)
Similar a Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料) (20)
Más de NTT DATA Technology & Innovation (20)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
- 1. © 2022 NTT DATA Corporation
Java 18で入ったJVM関連の(やや細かめな)改善
2022年3月29日 JJUGナイトセミナー
株式会社NTTデータ
阪田 浩一
- 4. © 2022 NTT DATA Corporation 4
Java 18でJVMに(ほんの少し)
関連するJEP
- 5. Java 18でJVMに(ほんの少し)関連するJEP
• JEP 416: Reimplement Core Reflection
with Method Handles
• JEP 421: Deprecate Finalization for Removal
© 2022 NTT DATA Corporation 5
- 6. JEP 416: Reimplement Core Reflection with Method Handles
• リフレクション機能のクラス (Method, Constructor, Field)
をメソッドハンドルを使って再実装する
» 再実装するだけで従来と振る舞いは変わらない
» マイクロベンチマークではよくある使い方の
上記のインスタンスをstatic finalフィールドに保持する
使い方であればパフォーマンスが向上する(43-57%⬆)
© 2022 NTT DATA Corporation 6
- 7. JEP 416: Reimplement Core Reflection with Method Handles
• 再実装する理由
1. Valhallaで言語機能の追加(value classやprimitive class)を
予定している
2. 従来のコードでは内部的に3つのコードパスがある
3. Valhallaへの対応で3つすべてを更新するのは高コストとなる
4. 現段階でメソッドハンドルを使うよう統一して備えておく
© 2022 NTT DATA Corporation 7
- 8. JEP 416: Reimplement Core Reflection with Method Handles
• 再実装する理由
1. Valhallaで言語機能の追加(value classやprimitive class)を
予定している
2. 従来のコードでは内部的に3つのコードパスがある
3. Valhallaへの対応で3つすべてを更新するのは高コストとなる
4. 現段階でメソッドハンドルを使うよう統一して備えておく
• ネイティブスタックフレームの使用も削減でき
Loom対応時にもメリットがある
• 振る舞いは変わらないのでアプリケーション開発者は
このJEPを調べなくてもよい
© 2022 NTT DATA Corporation 8
- 9. JEP 421: Deprecate Finalization for Removal
• finalize()メソッドを削除を前提とした非推奨APIに
» すでにJava 9から非推奨になっている
» 18で@Deprecated(forRemoval=true) にしたということ
© 2022 NTT DATA Corporation 9
- 10. JEP 421: Deprecate Finalization for Removal
• finalize()メソッドを削除を前提とした非推奨APIに
» すでにJava 9から非推奨になっている
» 18で@Deprecated(forRemoval=true) にしたということ
» 実行時オプション--finalization=enabled/disabledを追加
» 警告表示
-> オプションで指定したときのみ有効
-> 機能自体の削除
とバージョンごとに進んでいく見込み
© 2022 NTT DATA Corporation 10
- 16. © 2022 NTT DATA Corporation 16
Java 18以降で
コンテナ環境でJavaを使う際に
少しうれしい変更
- 17. コンテナ環境でのUnified Logging (ULログ)
• まずUnified Loggingとは
» JVM内部のすべてのコンポーネントで共通的に利用する
ログシステム
» Java 9から
» -Xlogオプションをつけてアプリケーションを実行すると
JVMのログを出力できる
© 2022 NTT DATA Corporation 17
- 19. コンテナ環境でのUnified Logging (ULログ)
• 各コンテナのULログを集約するケースは多くある
• ログデータ収集管理ツール (Fluent BitやLogstashなど)で
ULログを送る
• 実はULログに複数行エントリが出ることがある
» 上記ツール側でパース設定する方法もあるが…
» そもそも全エントリを必ず1行で出力してくれる方がよい
© 2022 NTT DATA Corporation 19
- 20. 複数行エントリが出る例
© 2022 NTT DATA Corporation 20
class ULMultiLine {
public static void main(String... args) {
throw new NullPointerException();
}
}
# Java 17以前で実行する
$ java -Xlog ULMultiLine
(中略)
[0.035s][info][exceptions ] Exception <a 'java/lang/NullPointerException'{0x000000061fc19180}>⏎
thrown in interpreter method <{method} {0x000000013d400210} 'main' '([Ljava/lang/String;)V' in 'ULMultiLine'>⏎
at bci 7 for thread 0x00007fdb19808800 (main)
- 21. 複数行エントリが出る例
© 2022 NTT DATA Corporation 21
class ULMultiLine {
public static void main(String... args) {
throw new NullPointerException();
}
}
# Java 17以前で実行する
$ java -Xlog ULMultiLine
(中略)
[0.035s][info][exceptions ] Exception <a 'java/lang/NullPointerException'{0x000000061fc19180}>⏎
thrown in interpreter method <{method} {0x000000013d400210} 'main' '([Ljava/lang/String;)V' in 'ULMultiLine'>⏎
at bci 7 for thread 0x00007fdb19808800 (main)
パースが必要となる
- 24. コンテナ環境でのUnified Logging (ULログ)
• 各コンテナのULログを集約するケース
• ログデータ収集管理ツール (Fluent BitやLogstashなど)で
ULログを送る
• foldmultilines=trueが追加されてULログの収集が
より簡便になった
© 2022 NTT DATA Corporation 24
- 25. © 2022 NTT DATA Corporation 25
18には入っていないが
ここ最近入った興味深い改善点
- 36. HSDISの新しいビルド手順
• OpenJDKのルートディレクトリへ移動する
• バックエンドを準備する
» パッケージマネージャーでインストールする
• brew install llvm capstone
» Binutilsはソースコードのみでも可
• OpenJDKと一緒にビルドする場合のコマンド例
» bash configure --enable-hsdis-bundling --with-hsdis=llvm
• 必要に応じて--with-llvm, -with-capstone, --with-binutils-src,
--with-binutilsで場所を指定できる
» make images
• 18では使用できない(masterブランチ、19系タグは🆗)
© 2022 NTT DATA Corporation 36
- 38. HSDISの新しいビルド手順 2
• HSDIS単体のビルドする場合のコマンド例
» bash configure --with-hsdis=binutils
--with-binutils-src=[binutilsディレクトリ]
» make build-hsdis
• build/macosx-x86_64-server-release/support/hsdis/
といったディレクトリにHSDISのファイルを出力する
• 以前のようにディレクトリを移動せず生成でき
ビルドがより簡単になった
© 2022 NTT DATA Corporation 38
- 39. Java 18でも新しい方法が使える?
• HSDIS単体のビルドする場合のコマンド例
» bash configure --with-hsdis=binutils
--with-binutils-src=[binutilsディレクトリ]
» make build-hsdis
• 18では上記コマンドを実行できるが
動作が不完全である
» タグjdk-18+gaで動作確認済
» HSDISのファイル(hsdis-amd64.so/dylib)が生成されない
» masterブランチでは前スライドの通り生成できる
© 2022 NTT DATA Corporation 39
- 46. © 2022 NTT DATA Corporation 46
Vector APIをHSDISで
見てみよう
- 48. Vector API
• https://openjdk.java.net/jeps/417
• 18で3rd Incubator
• Vector APIではJITコンパイル時にCPUアーキテクチャがサ
ポートするベクトル命令を使用する機械語を生成する
» SIMD命令
• x86ではSSE, AVX, AVX2, AVX-512
• ARMではNeon, Scalar Vector Extension(SVE)
• 本当にベクトル命令を使えているのかを見たい
» HSDISを使って確認できる
© 2022 NTT DATA Corporation 48
- 49. Vector API使用サンプルコード
import jdk.incubator.vector.*;
class VectorAPISample {
public static float[] dummyVar;
public static void main(String... args) {
float[] left = new float[] {0.0F,1.0F,1.5F,2.0F,0.0F,1.0F,1.5F,2.0F};
float[] right = new float[] {10.0F,11.0F,11.5F,12.0F,100.0F,101.0F,101.5F,102.0F};
var fva = new FloatVectorAddition();
for (int i = 0; i < 500_0000; i++) {
dummyVar = fva.add(left, right);
}
}
}
© 2022 NTT DATA Corporation 49
floatが8つある配列
32ビット * 8 = 256ビット
- 50. Vector API使用サンプルコード
import jdk.incubator.vector.*;
class FloatVectorAddition {
public float[] add(float[] left, float[] right) {
VectorSpecies<Float> species = FloatVector.SPECIES_256;
FloatVector l = FloatVector.fromArray(species, left, 0);
FloatVector r = FloatVector.fromArray(species, right, 0);
var lr = l.add(r);
float[] res = new float[8];
lr.intoArray(res, 0);
return res;
}
}
© 2022 NTT DATA Corporation 50
256ビット分を
一度に計算する指定
0 1 1.5 2 0 1 1.5 2
10 11 11.5 12 100 101 101.5 102
10 11 13 14 100 102 103 104
一気に加算
- 51. © 2022 NTT DATA Corporation 51
$ javac --add-modules jdk.incubator.vector VectorAPISample.java
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly --add-modules
jdk.incubator.vector VectorAPISample (実際は1行)
• Vector APIはIncubatorモジュール
» コンパイル時、実行時ともに--add-modulesでモジュール名を
指定する必要がある
• アセンブリの出力にSIMD命令があるかを見る
Vector API使用サンプル 実行
- 52. © 2022 NTT DATA Corporation 52
vaddpsは単精度浮動小数点のベクトル加算演算
ymmレジスタを使っている
SIMDレジスタ (Intel)
• xmm (128ビット)
• ymm (256ビット)
• zmm (512ビット)
- 54. このセッションのまとめ
• Java 18ではJVM関連の大きな変更点はない
• ValhallaやLoomの準備として内部実装を改善している
• finalize()は9から非推奨、18で削除予定ステータスに
• Unified Loggingのエントリをすべて1行で出せる
ようになった
• HSDISのビルド手順を改善している
• Vector APIがCPUのSIMD命令を使っていることを
HSDISで確認できる
© 2022 NTT DATA Corporation 54
- 55. © 2022 NTT DATA Corporation
All other company or product names mentioned here in are trademarks or registered trademarks of their respective owners.