Skip to content

Instantly share code, notes, and snippets.

@ykubota
Last active June 24, 2021 00:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ykubota/3afcfdac5b252bd31ae8c14b54b5d32f to your computer and use it in GitHub Desktop.
Save ykubota/3afcfdac5b252bd31ae8c14b54b5d32f to your computer and use it in GitHub Desktop.
Java 10による変更点。[Java 女子部](https://javajo.doorkeeper.jp/events/71949) と [JJUG Night Seminar](https://jjug.doorkeeper.jp/events/71974) で利用

Java 10: 利用や動作に影響を与える変更点

なお、本資料に記載しているものの一部は実機確認してないので、お使いのコードを修正する前に動作確認してください :)

はじめに

本資料はCompatibility & Specification Reviewを整理したものです

新しいバージョンがリリースされた時に注目すべきポイントはいくつか考えられる。よく注目される新機能は JEP として管理されるのでこれを確認するのがよい。これ以外に JSR で公開されている Specification は主に新機能レベルではない細かい新規追加 API や削除・非推奨化された API が記載されている。前者については色々なメディアや記事で取り上げられ、後者については有名なものでSimon Ritter桜庭さんがblogで取り上げている。

これらでは含まれていないポイントとして、APIの利用や動作に影響を与える変更点がある。企業、特に SIer などの「守り」が重要な企業では最も重要な項目である。これはいわゆる互換性を破壊するものであり、本資料はこれを列挙・整理している。講演ではこの中からピックアップして説明する。

Java 9までは機能ドリブンで機能の開発が間に合わなかった場合はリリースが延期されることになった。Java 10 からはタイムドリブンで締切に間に合った機能が搭載されるため、何かしらの機能が間に合わないからリリース延期ということは起こらない(はず)。本資料に挙げたものはJava 10に搭載されたものだが、一部はバックポートされてJava 9以前でも利用できる物がある。つまり非互換性が前バージョンに波及する事もある。ただし、LTS 以外は半年しか生存しないはずなので基本的には気にしなくて良い(はず)

Improvements for Docker Containers

Dockerなどのコンテナ上で Java を動作させた時に問題が発生していたため Java 8 から少しずつ改善が行われてきた。この問題とは、コンテナ等のゲスト環境の情報ではなくホストのOS情報を元にCPU数やメモリ量を算出して初期設定が行われていたため、過分にGCスレッドやJavaヒープサイズを割当てていたというもの。Java 8やJava 9でも改善が行われてきたが完全な対応には至って居らず、動作の変更も伴うためJava 10リリースのタイミングで最終的な改善取組が行われた。(バグや要望があれば引き続き改善は行われるはず)

これは本来はOptionおよびBehaviorの項目に入れるべきだが解りやすいように別にしている

  • JDK-8146115: Improve docker container detection and resource configuration usage
    • コンテナを認識せずホストのCPU数とメモリを基に設定や動作が行われていた問題を修正
      • -XX:+UseContainerSupport (デフォルト有効) が追加された。オフにすることでこの動作の変更を無効にすることができる(≒JDK 9以前と同じ動作にすることができる)
      • -Xlog:os+container=trace でコンテナ情報のロギングが可能になった
    • CPU数をcpu sets, cpu shares, cpu quotasを基に設定するようになった
      • -XX:ActiveProcessorCount= で上書可
    • 利用可能メモリサイズをcgroup filesystemの memory_limit を基に設定するようになった
  • JDK-8186248: Allow more flexibility in selecting Heap % of available RAM
    • ヒープに使用するシステムメモリ量を柔軟に設定することが可能になった。
    • -XX:{Initial,Max,Min}RAMPercentage
    • 既存のオプションに -XX:{Min,Max}RAMFraction と言うものがあるが、これは割合値を指定するものであり直感的ではなかった。(例えば、8を指定すると1/8となる)
  • JDK-8179498: attach in linux should be relative to /proc/pid/root and namespace aware
    • ホストからコンテナ上のプロセスにアタッチできるように改善された。
    • アタッチメカニズムに変更が入ったので動作の非互換性

API

Add

Remove

Change

  • JDK-8181149: Fix lint warnings in JAXP repo
    • java.xml APIの以下のraw typeを宣言していたメソッドが型パラメータを追加しました
    • javax.xml.namespace.NamespaceContext
      • Iterator<String> getPrefixes(String namespaceURI);
    • javax.xml.xpath.XPathFunction
      • public Object evaluate(List<?> args)
    • org.xml.sax.helpers.NamespaceSupport
      • public Enumeration<String> getPrefixes()
      • public Enumeration<String> getPrefixes(String uri)
      • public Enumeration<String> getDeclaredPrefixes()
  • JDK-8024352: MBeanOperationInfo accepts any int value as "impact"
    • javax.management.MBeanOperationInfo.MBeanOperationInfo コンストラクタの impact パラメータにINFOACTIONACTION_INFOUNKNOWN のいずれかでない int 値を渡した場合、IllegalArgumentException がスローされるようになりました  - JavaDocに上記のパラメータを渡すべしと書かれているのにも関わらず今まではスルーパスだった
  • JDK-8080225: FileInput/OutputStream/FileChannel cleanup should be improved
    • java.io.FileInputStream および java.io.FileOutputStream は、ファイナライズを使用して最終的なクローズを実行していた。非推奨な方法かつGCへの影響もあるため、これをが修正された
  • JDK-8187639: TrayIcon is not properly supported on macOS in multi-screen environment
    • java.awt.TrayIcon.displayMessage() on macOS
    • NSUserNotification APIを利用するように再実装され、カスタムウィンドウではなく標準の通知センターによりメッセージが表示されるようになりました

Deprecate

Tool

Add

Remove

Change

Option

Remove

Change

Behavior

Add

  • JDK-8166772: Touch keyboard is not shown for text components on a screen touch
    • Windows 8以降のSwing/AWT テキストコンポーネントにてタッチキーボードを自動で表示するようになりました。デフォルトで有効なため動作の非互換性です
    • -Dawt.touchKeyboardAutoShowIsEnabled=false を指定することで既存通り表示しないように設定可能  * Java 8u172から入る模様(バックポート一覧にはあるが動作未確認)

Change

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment