- Author: KUBOTA Yuji
- twitter: https://twitter.com/sugarlife
- email: kubota.yuji [at] gmail.com
なお、本資料に記載しているものの一部は実機確認してないので、お使いのコードを修正する前に動作確認してください :) 特に Java 12 は現時点ではリリースされてないので変わる可能性があります
本資料はCompatibility & Specification Reviewを整理したものです
新しいバージョンがリリースされた時に注目すべきポイントはいくつかあり、よく注目される新機能は JEP として管理されてるのでこれを確認するのがよい。これ以外に JSR で公開されている Specification では新機能レベルではない細かい新規追加 API や削除・非推奨化された API が記載されている
この他に「既存APIの利用や既存アプリの動作に影響を与えるかどうか」という観点があり、ソフトウェア開発コミュニティや企業の「互換性の保守」が求められる団体では最も重要である。これはリリースノートで確認できるが、本資料ではもう少し突っ込んで仕様変更を伴う際に行われるレビューCSR(Compatibility & Specification Review)をIssue Trackerとソースコード+構成管理情報から調査し、ユーザが影響を受ける可能性がある変更内容を整理した
- JDK-8211384: Obsolete -XX:+/-MonitorInUseLists option
-XX:(+/-)MonitorInUseLists
オプションが無視されるようになった(Obsolete)。将来的に削除される
- JDK-8211845: A new switch to control verbosity of hs-err files
-XX:+ExtensiveErrorReports
オプションが追加された。- これを有効にした場合 hs_err.log がより多くの情報を含むようになる。プロダクションビルドではデフォルトで無効
- JDK-8202286: Allocation of old generation of Java heap on alternate memory devices
- 試験機能としてG1 / Parallel GC利用時にOld領域のヒープをNV-DIMMに割り当てることが可能になった
-XX:AllocatedOldGenAt=<path>
でnv-dimmファイルシステムのパスを指定すると有効になる。Memory-mapped fileが作られる- 注意点
- 試験機能
- 現実装ではXmxサイズだけnv-dimmファイルシステムにてプリアロケートするため、nv-dimm領域に十分なスペースを用意する必要がある
- Young領域はDRAM。また-Xmxで指定した値がdramの値以上の場合、以下の順でYoung領域の最大値が決まる
- MaxNewSize or -Xmn が設定されていない: dram or -XX:MaxRAM の -XX:MaxRAMPercentage(デフォルト80%)
- MaxNewSize or -Xmn が設定されている: 設定した値またはdram or -XX:MaxRAM の -XX:MaxRAMPercentage のうち低い値
- Young領域のサイズは gc+ergo=info のロギングで出力される
- JDK-6490394: G1: Allow heap shrinking / memory unmapping after reclaiming regions during Remark
- G1 の concurrent mark cycle 時に最大で最小ヒープサイズまで不要なメモリを返すようになった。
- 基本的にJVMは一度掴んだメモリはOSに返さないため、それに合わせてXmxを低くせざるを得なかったケースに向いている。
- JDK-8213325: (props) Properties.loadFromXML does not fully comply with the spec
java.util.Properties#loadFromXML
に不正なXML文書を渡すとInvalidPropertiesFormatException
を正しく返すようになった- これにより
Properties#storeToXML
で出力したXMLは問題ないが、それ以外のXML文書がフォーマットに従っていないと拒否されるようになった- 今後は
Properties#storeToXML
で生成されたDTDを厳守する必要がある
- 今後は
- JDK-8212129: Remove Finalize methods from ZipFile, Inflater and Deflater
java.util.ZipFile
,java.util.Inflator
,java.util.Deflator
のfinalize
メソッドが削除された。Java 9で非推奨化済みかつ何もしないメソッドになっていた- これらのクラスを継承して
finalize
メソッドをオーバーライドしてた場合、投げる Exception の宣言が変わるので注意。(Object#finalizeを継承することになるのでIOExceptionからThrowableに変わる)java.lang.ref.Cleaner
やtry-with-resource
を使いましょう
- JDK-8211398: Square character support for the Japanese new era
- 新元号対応。後は文字を入れるだけ。
- http://blog.unicode.org/2018/09/new-japanese-era.html
- JDK-8177552: Compact Number Formatting support
NumberFormat
が短縮数字をサポートするようになった。[Compact Number Formats](a href="http://unicode.org/reports/tr35/tr35-numbers.html#Compact_Number_Formats")に従う- 例(en_US): 1K = 1000, 1M = 1000000
- 例: NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT).format(1000); returns "1K"
- JDK-8212828: (process) Provide a way for Runtime.exec to use posix_spawn on linux
jdk.lang.Process.launchMechanism
にPOSIX_SPAWN
が追加された(Linux限定)- もともと他の*nix系では利用できていた。Linuxのデフォルト値は
VFORK
だがそれは変更されていない
- もともと他の*nix系では利用できていた。Linuxのデフォルト値は
- JDK-8209923: Unicode 11
- Unicode 11がサポートされた。なおJava 11はUnicode 10までだった。
- JDK-8185496: Improve performance of system properties initialization in initPhase1
user.timezone
システムプロパティの初期値はコマンドラインで指定されない場合は未定義だったuser.timezone
が必要になった場合、OSの値が利用されるようになった。今までは""(empty string)だった- Java 12からは
System.getProperty("user.timezone")
はNULLを返す。 - ソース確認中
- JDK-8213616: URLPermission with query or fragment behaves incorrectly
java.net.URLPermission
が微修正された- そのうち追記(動作確認中)
- JDK-8192939: Remove Finalize methods from FileInputStream and FileOutputStream
FileInputStream
とFileOutputStream
のfinalize
メソッドが削除された。これらはJava 9で非推奨になっていたjava.lang.ref.Cleaner
やtry-with-resource
を使いましょう
- JDK-8212941: Support new Japanese era in java.time.chrono.JapaneseEra
- 新元号対応の準備。後は文字を入れるだけ。
- JDK-8210692: The "com.sun.awt.SecurityWarning" class can be dropped
com.sun.awt.SecurityWarning
が削除された。Java 11で非推奨化されそのまま削除- 内部クラス+JDK内部で使ってないのでサクッと非推奨化から削除された。
- JDK-8213495:Release Note: LDAPS Communication Failure
- LDAP over SSL/TLS に失敗している問題の修正。
- JDK 8u191 にバックポート済み。
- JDK-8213909: jdeps --print-module-deps should report missing dependences
jdeps
ツールのオプション(--print-module-deps
,--list-deps
,--list-reduce-deps
)が強化された- モジュールが必要としているクラス間の依存関係だったが間接・非直接的依存(transitively)も含めて調査するようになった。
--no-recursive
オプションを付けることで、従来通り直接依存しているクラスのみ調査する
--ignore-missing-deps
オプションを付けることで依存クラスがなくてもエラーとならずに調査を続行する- これを付けてカスタムイメージを作ることもできるが(依存クラスがなければ)当然起動しないので注意
- JDK-8076190: Customizing the generation of a PKCS12 keystore
- PKCS #12 keyhstoreをカスタマイズ可能になった。詳しい設定は
java.security
ファイル参照
- PKCS #12 keyhstoreをカスタマイズ可能になった。詳しい設定は
- JDK-8212003: Deprecating the default keytool -keyalg value
keytool
ツールの-keyalg
,-genkeypair
,-genseckey
コマンドが非推奨になった
- JDK-8213400: Support choosing group name in keytool keypair generation
keytool
ツールに-groupname
オプションが追加された。キーペア作成時にグループネームを指定するのに使う- 例:
keytool -genkeypair -keyalg EC -groupname secp384r1
- アルゴリズムを正確に一意にするため
groupname
を指定する時は-keysize
を意識するようにするのが望ましい
- アルゴリズムを正確に一意にするため
- JDK-8191053: Provide a mechanism to make system's security manager immutable
java.security.manager
システムプロパティにdisallow
とallow
トークンオプションが追加されたSystem.setSecurityManager
で許可されてないものを設定するとUnsupportedOperationException
が投げられるようになった- SecurityManagerについては
java.lang.SecurityManager
のJavaDocを確認しましょう。
- JDK-8207258: Distrust TLS server certificates anchored by Symantec Root CAs
- bye Symantec.
- DigiCert support page
- 自己責任でSymantecを使いたい場合は
java.security
設定ファイルのjdk.security.caDistrustPolicies
からSYMANTEC_TLS
を消せば使える
- JDK-8214140: Remove TLS v1 and v1.1 from SSLContext required algorithms
- TLSv1とTLSv1.1が削除された
- 具体的には
javax.net.ssl.SSLContext
APIとJava Security Standard Algorithm Name仕様から削除された
- JDK-8211883: Disable anon and NULL cipher suites
jdk.tls.disabledAlgorithms
に anon (anonymous) と NULL のcipher suiteが追加され、デフォルトでは無効になった
- JDK-8140466: ChaCha20 and Poly1305 TLS Cipher Suites
- 新しい TLS 暗号スイート(Cipher Suites) ChaCha20-Poly1305 アルゴリズムがJSSEに追加された。
- TLS Cipher Suitesについては、詳しくはJava Secure Socket Extension (JSSE) Reference Guideを参照すること
- JDK-8208350: Disable all DES cipher suites
- DESベースのTLS暗号スイートが全て無効化された。
jdk.tls.disabledAlgorithms
に追加されているので、自己責任で削除してSSLSocket#setEnabledCipherSuites
またはSSLEngine#setEnabledCipherSuites
メソッドで追加すれば利用することができる。
- JDK-8213363: X25519 private key PKCS#8 encoding/decoding is incorrect
- RFC 8410で定義されていたX25519とX448プライベートキーのエンコードフォーマットが誤っていたのが修正された
- 以前まで利用できてた誤ったフォーマットに則ったこれらのプライベートキーは作り直しましょう
- JDK-8210821: Support dns_canonicalize_hostname in krb5.conf
- kerberosの
dns_canonicalize_hostname
に対応した。 - https://web.mit.edu/kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html
- kerberosの
- JDK-8210432: Add additional TeliaSonera root certificate
- TeliaSonera ルート証明書が追加された
- JDK-8203230: Remove cacerts.internal from Oracle JDK
- AOL と Swisscom ルート証明書が削除された
- OpenJDKにはもともと無く、Oracle JDKから削除された
- JDK-8195793: Remove GTE CyberTrust Global Root
- GTE CyberTrust Global ルート証明書が期限切れとなり削除された
一意 ?