Java 26

2026年3月17日リリースの非LTS版。「G1がJDK 26でデフォルトになった」と誤解されがちだが、G1はJava 9(JEP 248)からすでにデフォルトGCであり、Java 26で変わったのはG1自体の性能改善と、GC以外の複数のデフォルト値・非推奨化。

G1 GC: 同期削減によるスループット改善(JEP 522)

第2のカードテーブルを導入し、最適化エンジンとアプリケーションスレッドの競合を減らした。ライトバリア命令数が50から12に削減され、実測で5〜15%のスループット向上が報告されている。オブジェクト参照フィールドを頻繁に書き換えるアプリケーションほど効果が大きい。この改善を土台に、Java 27でG1を全環境のデフォルトGCにするJEP 523が提案されている。

G1のその他の変更

  • ヒープリージョンの半分以上を占める巨大オブジェクト(参照を含むもの)を、従来のフルGC時のみでなく即座に回収できるようになった。
  • GCオーバーヘッドがGCTimeLimit(デフォルト98%)を超え、空きヒープがGCHeapFreeLimit(デフォルト2%)未満の状態が5連続GCで続くとOutOfMemoryErrorを送出するようになった(Parallel GCと同じ挙動に統一。GCスラッシング防止が目的)。-XX:-UseGCOverheadLimitで無効化可能。
  • Java 25で発生していたTransparent Huge Pages(THP)利用不可の不具合が修正された(Java 25.0.2にもバックポート済み)。

sun.misc.Unsafeメモリアクセス、デフォルトが例外送出に

Java 23(JEP 471で非推奨予告)→Java 24(JEP 498でデフォルト警告)と進んできたプロセスの3段階目。Java 26からは未対応の操作がデフォルトで例外(UnsupportedOperationException)を送出するようになった(--sun-misc-unsafe-memory-access=deny相当)。

Project LeydenのAOTキャッシュ、全GC対応に(JEP 516)

詳細はProject Leyden側のノートを参照。

JVMフラグのデフォルト変更・非推奨化

  • InitialRAMPercentage: 2007年から変わっていなかったデフォルト値1.5625(1/64)を0に変更。システムメモリが増えた現在では過大なヒープサイズにつながっていたため。MinHeapSize/InitialHeapSizeと同様、JVMエルゴノミクスに委ねる挙動になった。
  • AlwaysActAsServerClassMachine / NeverActAsServerClassMachine: 削除予定として非推奨化。元々はG1(サーバー向け)とSerial(クライアント向け)の選択を制御する役割だったが、Java 27でG1が全環境のデフォルトになるため区別自体が不要になる。
  • AggressiveHeap: 特定ベンチマークを満たす目的で追加されたが透明性に欠けるとして、削除予定に。
  • MaxRAM: JVMが物理RAMを正確に検出できるようになったため削除予定に。-Xmx/-Xmsでの明示指定が推奨。

その他

  • C2 JITコンパイラが30個以上のパラメータを持つメソッドもコンパイルできるようになり、C1へのフォールバックやインタプリタ実行を回避できるようになった。
  • Serial GCのYoung世代のレイアウトが「eden→survivor」から「survivor→eden」に変更され、eden領域が世代末尾まで動的に拡張可能になった(過度なOutOfMemoryErrorの回避が狙い)。
  • java.lang.management.MemoryMXBeangetTotalGcCpuTime()が追加されるなど、JMX周りの改善も入っている。

出典

#java #openjdk

作成日時: 2026-08-19 22:56 / 更新日時: 2026-08-19 22:56