記事ディレクトリ
JAVA19の概要
JDK 19 は、2022 年 9 月 20 日に本番使用向けに正式にリリースされましたが、長期サポート バージョンではありません。ただし、JDK 19 には注目に値する重要な新機能がいくつかあります。
JDK 19 の新機能は 7 つだけです。
- JEP 405: レコードパターン[1] (プレビュー)
- JEP 422: Linux/RISC-V ポート[2]
- JEP 424: 外部関数およびメモリ API [3] (プレビュー)
- JEP 425: 仮想スレッド [4] (プレビュー)
- JEP 426: Vector API[5] (4 回目のインキュベーション)
- JEP 427: スイッチのパターン マッチング (スイッチ パターン マッチング)[6]
- JEP 428: 構造化同時実行 [7] (インキュベーション)
1. 録音モード(プレビュー版)
レコード パターンを使用してJava プログラミング言語を強化し、レコード値を分解します。レコード パターンと型パターンをネストして、強力で宣言的で構成可能な形式のデータ ナビゲーションと処理を可能にします。
2.Linux/RISC-V移植
JDK の Linux/RISC-V への移植では、現在、RISC-V (ベクトル命令を含む汎用 64 ビット ISA) の RV64GV 構成のみがサポートされています。将来的には、汎用 32 ビット構成 (RV32G) などの他の RISC-V 構成のサポートが検討される可能性があります。
3. 外部関数とメモリAPI(プレビュー版)
Java プログラムが Java ランタイムの外部のコードやデータと相互運用できるようにする API を導入します。この API は、
外部関数 (JVM の外部のコード) を効果的に呼び出し、外部メモリ (JVM によって管理されないメモリ) に安全にアクセスできるため、Java プログラムが
JNI の脆弱性や危険性を回避してネイティブ ライブラリを呼び出し、ネイティブ データを処理できるようになります。
4. 仮想スレッド(プレビュー版)
JVM スレッドとオペレーティング システム スレッドは 1 対 1 に対応しており、スレッドの実際の実行は、OS がスケジュール用のリソースを割り当てるまで待つ必要があります。したがって、オペレーティング システムのスレッド数の制限は、JVM スレッドの数にも影響します。Centos7 でオペレーティング システムのスレッド数を変更する方法。
# vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65535
* hard nproc 65535
仮想スレッド:
前述の JVM スレッド制限問題に対応して、JDK19 ではスレッド数の制限をある程度突破できる仮想スレッド方式を提供しています(golang goroutine の設計思想を参考にしています)。JDK19では、スレッドはプラットフォームスレッド(Platform Thread)と仮想スレッド(Virtual Thread)に分けられます。
上図に示すように、仮想スレッドはJVMによって完全に管理され、オペレーティングシステムの制限を受けないため、JVMはビジネスロジックを実行するための仮想スレッドを大量に生成することができ、システムのスループットが向上します。でも、でも、でも (重要なことは 3 回言います)、この機能はまだ成熟していないため、運用環境での使用はお勧めできません。
ケースコード:
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
// 启动虚拟线程
Thread.startVirtualThread(()->{
System.out.println(Thread.currentThread() );
});
}
Thread.sleep(10000);
System.out.println("Hello ...");
}
関連する API の説明:
- Thread.ofVirtual() は仮想スレッドを作成します
- Thread.ofPlatform() はプラットフォーム スレッドを作成します
- Thread.startVirtualThread(Runnable) は仮想スレッドを作成して実行します
- Executors.newVirtualThreadPerTaskExecutor() スレッド プール
テストコード
public class Test03 {
public static void main(String[] args) throws Exception {
//ExecutorService executorService = Executors.newFixedThreadPool(1);
ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.execute(new MyTask());
Thread.sleep(2000);
}
static class MyTask implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread());
try {
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(LocalDateTime.now());
}
}
}
JVMパラメータを変更する
-Djdk.virtualThreadScheduler.parallelism=1 -Djdk.virtualThreadScheduler.maxPoolSize=1
コアスレッド数とForkJoinPoolの最大スレッド数を設定する
- -Djdk.virtualThreadScheduler.Parallelism=1
- -Djdk.virtualThreadScheduler.maxPoolSize=1
5.Vector API(4回目のインキュベーション)
実行時に確実にコンパイルされるベクトル計算を表現する API を導入し、サポートされている CPU アーキテクチャでベクトル命令を最適化し、スカラー計算を上回るパフォーマンスを実現します。
6.スイッチパターンマッチング(第3プレビュー版)
switch
式とステートメントのパターン マッチング、およびパターン言語の拡張により、Javaプログラミング言語を強化します。パターン マッチングが拡張されswitch
、多数のパターンに対して式をテストできるようになり、複雑なデータ指向のクエリを簡潔かつ安全に表現できるようになりました。
この機能は Java 17 でプレビューとして初めて登場し、Java 19 は 3 番目のプレビューです。
7. 構造化された同時実行性 (インキュベーションフェーズ)
構造化同時実行のための API を導入することでマルチスレッド プログラミングを簡素化します。これにより、異なるスレッドで実行される複数のタスクが 1 つの作業単位として扱われ、エラー処理が簡素化され、信頼性が向上し、可観測性が向上します。