Tweet / Photo allowed.
This work by
Windymelt
is licensed under
CC BY-SA 4.0
class: center, middle # 令和最新版のJVMの色々
2025-05-10 Kyoto.kt #3 `id:Windymelt` --- ## 令和最新版って若者はもう言ってないのでは・・・ - 本質情報 --- ## 話すこと - Java 24 が出てるので面白そうな機能を紹介 - JEP 404: Generational Shenandoah (exp.) - JEP 450: Compact Object Headers (exp.) - JEP 483: AOT Class loading / linking --- ## Windymelt - [Windymelt](https://www.3qe.us/)です - 全宇宙でこの ID を使っています - GitHub, X/Twitter, mixi2, etc... - Signal: `windymelt.23` - PGP: `F2FC 63C2 42C0 4D9D` - 2016- [株式会社はてな](https://hatena.co.jp/) - [AIを利用した発話分析ソリューション toitta](https://toitta.com/)の開発 - プライベート - [最近MCPサーバをScalaでフルスクラッチした](https://blog.3qe.us/entry/2025/04/29/004251) --- ## Windymelt
- [PR]プログラミング言語コミュニティ『Scalaわいわいランド』主宰 - ↑ググって〜 - 敵ではありません --- class: center, middle ## 今回は Scala の話はいったん措いて JVM の話をするか・・・ --- ## Java 24 で色々追加された - 2025/3/18 にリリースされた - 色々機能追加されているがそのうち面白そうなものを紹介 - Kotlin / Scala / Java 問わずに使えそう --- class: center, middle ## Generational Shenandoah (exp.) - JEP 404 --- ## Shenandoah GC - Shenandoah とは GC アルゴリズムの一種 - Shenandoahとは『カントリー・ロード』に登場するシェナンドー川のこと --- ## Shenandoah 特性 - 低いレイテンシ(GC Pause が短い)、そこそこのスループット - G1GC よりもレイテンシが低い - ZGC よりもレイテンシが高い? - ゲームやリアルタイムアプリケーション向け - `-XX:+UseShenandoahGC` で Shenandoah GC を有効化できる --- ## Generational Shenandoah - Generational Shenandoah はその名の通り世代別 GC - 世代別 GC とは(ザックリ) - ヒープを世代に分けて世代ごとに GC を行う - 世代別 GC の例 - Young GC: 新しいオブジェクトが入れられる - Old GC: Young GCで生き残った古いオブジェクトが入れられる - なんか効率が良い感じになる - `-XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCMode=generational` で有効化できる --- class: center, middle ## Compact Object Headers - JEP 450 --- ## Compact Object Headers - Compact Object Headers はオブジェクトヘッダを圧縮する機能 --- ## オブジェクトヘッダ?? - JVM 上のオブジェクトはメモリ上に配置される - オブジェクトはメモリ上に配置されるときにオブジェクトヘッダを持つ - メタデータを持つ - あらゆるオブジェクトに必要となるので、サイズが大きいとメモリを圧迫する - 今のところJVMでオブジェクトヘッダは 96 .. 128 bits 必要 --- ## Compact Object Headers - 96 .. 128 bits のオブジェクトヘッダを 64 bits に圧縮する - メモリ使用量が若干減る - 小さなオブジェクトを大量に作成するアプリケーションで効果がある - e.g. 関数型プログラミングはimmutableなオブジェクトを大量に作成する - `-XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders` で有効化できる --- class: center, middle ## AOT Class loading / linking - JEP 483 --- ## AOT Class loading / linking - AOT Class loading / linking は AOT コンパイラを使ってクラスをロードする機能 --- ## AOT - Ahead Of Time - コンパイルを実行時ではなく、事前に行うこと - そもそも JVM は JIT コンパイラを使って実行時にコンパイルを行う - AOT は先に全部やろうという発想 - ただし、AOT は JIT よりも遅い (最適化すべき場所が分からないため) - AOT は JIT よりも早く起動する --- ## AOT Class loading / linking - トレーニング - キャッシュ - 実行 --- ## トレーニング ```sh java -XX:AOTMode=record \ -XX:AOTConfiguration=app.aotconf \ -cp app.jar \ app.main ``` AOT 用のメタデータを作成する --- ## キャッシュ ```sh java -XX:AOTMode=create \ -XX:AOTConfiguration=app.aotconf \ -XX:AOTCache=app.aot \ -cp app.jar ``` 実際にコンパイルした結果をキャッシュする --- ## 実行 ```sh java -XX:AOTMode=on \ -XX:AOTCache=app.aot \ -cp app.jar ``` AOT コンパイルした結果を使って実行する