- Author: KUBOTA Yuji
- twitter: https://twitter.com/sugarlife
- email: kubota.yuji [at] gmail.com
なお、本資料に記載しているものの一部は実機確認してないので、お使いのコードを修正する前に動作確認してください :)
新しいバージョンがリリースされた時に注目すべきポイントはいくつか考えられる。よく注目される新機能は JEP として管理されるのでこれを確認するのがよい。これ以外に JSR で公開されている Specification は主に新機能レベルではない細かい新規追加 API や削除・非推奨化された API が記載されている。前者については色々なメディアや記事で取り上げられ、後者についてはblog記事などで取り上げられていることが多い。
これらでは含まれていないポイントとして、APIの利用や動作に影響を与える変更点がある。企業、特に SIer などの「守り」が重要な企業では最も重要な項目である。これはいわゆる互換性を破壊するものであり、本資料はこれを列挙・整理している。
- JDK-8203394: Implementation of JEP 331: Low-Overhead Heap Profiling
- JEP 331: Low-Overhead Heap ProfilingによりJavaヒープアロケート状況をサンプリングするJVMTI APIが追加された。ツールではないので注意
- 純粋な追加なのでソースレベルの影響はないのだが、使うとパフォーマンスに少なからず影響が発生する。使わなければ当然その影響もない
- JDK-8060192: Add default method <A> A[] Collection.toArray(IntFunction<A[]> generator)
java.util.Collectionインターフェースに新しいデフォルトメソッドtoArray(IntFunction)が追加された。これは既存メソッドtoArray(T[])のオーバーロードである- インターフェースの変更なので影響(ソースの非互換性)が発生する。バイナリの非互換性は発生しない
- 例えば
list.toArray(null)のようなコードは、今まではtoArray(T[])メソッドと解決していたのが、toArray(IntFunction)とも一致してしまうため解決ができずコンパイル時にエラーが発生する- 以前のバージョンでコンパイル済みの場合は
toArray(T[])にリンクされてるので問題は生じない=バイナリの非互換性は発生しない
- 以前のバージョンでコンパイル済みの場合は
- JDK-8202088: Japanese new era implementation
- 平成の次の元号が出力するための前準備
java.time.chrono.JapaneseEra.of(3).getDisplayName(java.time.format.TextStyle.FULL, Locale.JAPAN)==> "元号"- 今は元号が確定していないので数字(3)で指定が必要
- 今は"元号" (Locale.JAPAN) や "NewEra" (Locale.US) が出力される。判明後アップデート予定
- しかし政府が1ヵ月しか余裕を持たせなかったのでほぼ確実に間に合わない
- JDK-8204243: remove Thread.destroy() and Thread.stop(Throwable)
Thread.destroy()とThread.stop(Throwable)がついに削除されたThread.stop()は残されており影響はない
- JDK-8204187: Remove proprietary JPEG code from javax.imageio
- Oracle JDKのJPEGライブラリ独自拡張が削除された。(使ってる人は少ないと思うが詳細はリンク先を確認)
- JDK-8193033: remove terminally deprecated sun.misc.Unsafe.defineClass
- JDK Internal APIの
sun.misc.Unsafe.defineClassが削除された java.lang.invoke.MethodHandles.Lookup.defineClassが代替API
- JDK Internal APIの
-
- クラスパスに指定のアノテーションクラスがなかった場合、
Class.getAnnotation()はArrayStoreExceptionを返していたが、正しくTypeNotPresentExceptionを返すように修正された - JDK 6時代からのバグ
- クラスパスに指定のアノテーションクラスがなかった場合、
-
JDK-8197564: HTTP Client implementation
- JEP 321: HTTP Client (Standard)により JDK 9で incubated として導入されていた HTTP Client API が更新&標準APIに昇格した
- 詳細はAPI javadoc (
java.net.http)で確認ができる。量が多いのでここでは触れない - ユーザ的には"Add"だがincubatedが外れてモジュールの名前が変わったので"Change"
-
JDK-8201793: (ref) Reference object should not support cloning
java.lang.ref.Reference::cloneメソッドは常にCloneNotSupportedExceptionを返すようになった。事実上の廃止- コンストラクタを読んで新たなReferenceオブジェクトを作ってクローンするべき
- JDK-8072996: Deprecate stream-based GSSContext methods
- RFC 8353から削除された
org.ietf.jgss.GSSContextの一部メソッドが非推奨化
- RFC 8353から削除された
- JDK-8204492: Add deprecation annotation to Nashorn APIs and warning to nashorn, jjs
- JEP 335: Deprecate the Nashorn JavaScript EngineによりNashornとjjsツールが非推奨化。将来的に削除される
-Dnashorn.args=--no-deprecation-warningオプションで警告非表示が可能
- JDK-8199871: Deprecate pack200 and unpack200 tools
java.util.jarのPack200 APIが非推奨化。将来的に削除されるpack200,unpack200ツールが非推奨化。 JDK 11では同梱されるが更新はされない
- JDK-8202331: Obsolete support for commercial features
- 商用機能オープン化に伴い
-XX:+UnlockCommercialFeaturesと-XX:+LogCommercialFeaturesが廃止 jcmdのコマンドVM.unlock_commercial_featuresとVM.check_commercial_featuresも廃止
- 商用機能オープン化に伴い
- JDK-8066709: Make some JDK system properties read only
- 以下のプロパティは起動時にキャッシュされ変更不可となった
java.home,user.home,user.dir,user.nameSystem::setPropertyで変更しても標準API(java.base)の動作は影響を受けない
- JDK-8209963: source file mode for JVM should provide a hook to locate the source file
- JEP 330: Launch Single-File Source-Code Programsにより、スクリプトのように単体Javaファイルを直接実行できるようになった
- 詳細はこちらのスライドで解説してる
- JDK-8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
- JEP 333により巨大ヒープ向け低レイテンシGCが試験的に追加された
- JDK-8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
- JEP 318により「何もしない(no-op)」GCが試験的に追加された
- JDK-8197532: Re-examine policy for the default set of modules when compiling or running code on the class path
- ルートモジュールのデフォルトセットが変更された
java.seが外され解決できなくなった
- JDK-8193302: Javac AssertionError: typeSig ERROR on usage of @Generated
javacで-source >=9や-release >=9を指定してコンパイルする際、コンパイル対象のクラスが所属しているモジュールから不可視なパッケージをimportしている場合は失敗するようになりました
- JDK-8010319: Implementation of JEP 181: Nest-Based Access Control
- JEP 181: Nest-Based Access Controlが追加された
- 端的に言うとネストする側とされる側のバイトコード出力が整理された
- ソースの非互換性は生じないが、ASM bytecode manipulationやjavap classfile inspectionツールなどはほぼ確実に影響を受ける
- JDK-8202537: Update locale data to Unicode CLDR v33
- CLDRがVersion 33にアップデート
- ロケールデータはJava 9からデフォルトでCLDRが優先されている
- JDK-8191410: Unicode 10.0.0 support
- JEP 327: Unicode 10をサポート。新たな絵文字も使えるように
- JDK-8207032: Compilation succeeds without checking readability when --add-exports used
javacで--add-exportsオプションを用いると自動的にターゲットモジュールからエクスポートモジュールが読み込み可能になっていたのが修正された。今後は適切に--add-readsオプションを利用する必要がある- 読込や公開範囲を制御するためのモジュール化の筈なのに、自動的に公開しちゃってたのでちゃんと制御させますよという修正
- JDK-8206211: Drop JVM-MANAGEMENT-MIB.mib from Java SE
- SNMP Agentの削除に伴いMIBファイルが削除された
- JDK-8203664: JFR start failure after AppCDS archive created with JFR StartFlightRecording
- CDS(Class Data Sharing)のダンプ中はFlight Recorderが無効化されるようになった
- JDK-8187577: JVM crash during gc doing concurrent marking
- 並行マーキング時に到達不可能とみなされていたクラスが、スレッドローカルなJNIHandlesに格納されていて後から参照されてクラッシュするケースがあった
- このため、
ClassLoaderData/SystemDictionaryからフェッチされたクラスが復活した場合はG1のSTABに通知されるように修正が行われた - Java 8にバックポート済み
- JDK-8205043: Make parallel reference processing default for G1
- GCスレッドが1より多い場合、デフォルトで
ParallelRefProcEnabledが有効になり、参照処理が並列化される
- GCスレッドが1より多い場合、デフォルトで
- JDK-8205064: Fail immediately if an unavailable GC is selected
- これまでは使用できないGC (例:minimalなJVMビルドではG1は使えない)を指定した場合は警告メッセージを出しつつ別のGCを利用して起動していたが、Java 11からは直ちに終了するように修正された
- モジュール化やProject PortlaによりGCを限定したビルドが作成可能になったため、このようなケースが発生していた
- JDK-8198649: Switch AWT/Swing's default GTK version to 3
- Java 9からサポートしたGTK3をデフォルトにした (見た目が多少変わる)
- 引き続きGTK2.2を使いたい場合は
-Djdk.gtk.version=2.2を設定する
- JDK-8198794: Hotspot crash on Cassandra 3.11.1 startup with libnuma 2.0.3
- 古いlibnuma(<=2.0.9)でNUMAを使っていた(
-XX:+UseNUMA)場合、クラッシュする問題がありその修正が行われた。JVM内処理の変更が入ったがユーザ的には気にしなくて大丈夫 - Java 8にもバックポートが行われている。古いlibnumaを使う場合はアップデートが必要
- 古いlibnuma(<=2.0.9)でNUMAを使っていた(
- JDK-8191510: Bump class file version number to 54.0
- バージョンアップ恒例のクラスバージョン番号のインクリメント
- 新しいバージョンでビルドしたものを古いバージョンで実行するとでてくるやつ
- Remove cacerts.internal from Oracle JDK
- ルート証明書(AOLとSwisscom)が削除された
- JDK-8191844: Remove SECOM root (secomevrootca1)
- 一部のルート証明書(SECOM)が削除された
- JDK-8189949: Remove Baltimore Cybertrust Code Signing CA
- 一部のルート証明書(Baltimore Cybertrust Code Signing)が削除された
- JDK-8191031: Remove several Symantec Root CAs
- 一部のルート証明書(Symantec)が削除された
- JDK-8209506: Add Google Trust Services GlobalSign root certificates
- 一部のルート証明書(Google Trust Services GlobalSign)が追加された
- JDK-8199779: Add T-Systems, GlobalSign and Starfield services root certificates
- 一部のルート証明書(T-System、Amazon (Starfield Services)、GlobalSign)が追加された
- JDK-8195774: Add Entrust root certificates
- 一部のルート証明書(Entrust)が追加された
- JDK-8196141: Add GoDaddy root certificates
- 一部のルート証明書(GoDaddy)が追加された
- JDK-8209965: The "supported_groups" extension in ServerHellos
- セキュリティ修正。 ServerHello ハンドシェイクメッセージにsupported_groups拡張(RFC7919)は存在するべきではないが、そのチェックを行っていなかったのを修正
- JDK-8205445: Add RSASSA-PSS Signature support to SunMSCAPI
- SunMSCAPIプロバイダがRSASSA-PSS署名アルゴリズムをサポート
- JDK-8198925: ChaCha20 and ChaCha20-Poly1305 Cipher Implementations
- JEP 329: ChaCha20 and Poly1305 Cryptographic AlgorithmsにてRFC 7539のChaCha20とChaCha20-Poly1305暗号方式が追加された
- JDK-8171277: Elliptic Curves for Security in Crypto
- JEP 324: Key Agreement with Curve25519 and Curve448にてRFC 7748の公開鍵暗号Curve25519とCurve448が追加された
- JDK-7007966: Add Brainpool ECC support (RFC 5639)
- SunECプロバイダはRFC5639の4つのBrainpool楕円曲線暗号をサポートするようになった
- JDK 7時代に提案されていたものがようやく入った。なおSunJSSEは未対応
- JDK-8196584: TLS 1.3 Implementation
- JEP 332: Transport Layer Security (TLS) 1.3によりRFC 8446のTLS 1.3がサポートされ、新たなオプションがいくつか追加さた。詳細はJava Secure Socket Extension(JSSE) Doc参照
- TLS 1.3は1.2以前とは互換性が一部損なわれているため、利用する場合は動作の非互換性が生じる
- JDK-8208526: TLS 1.3 half-close and synchronization issues
- duplex-closeを強制する
jdk.tls.acknowledgeCloseNotifyプロパティが追加された - TLS 1.2以前はduplex-close policyだがTLS 1.3はharf-close policyである。この差異をソースコードを変更することなく対応するために用意された
- duplex-closeを強制する