Movatterモバイル変換


[0]ホーム

URL:


Yuji Kubota, profile picture
Uploaded byYuji Kubota
10,049 views

Catch up Java 12 and Java 13

Presentation for Java Japan User Group CCC 2019 Spring

Embed presentation

Downloaded 24 times
CatchupJava12andJava13KUBOTAYuji(@sugarlife)LINECorporationJJUGCCC2019Spring(2019/May/18)
KUBOTAYuji(@sugarlife)JVM好き,IcedTeacommitter/OpenJDKAuthorWEB+DBで「DivetoJava」連載中https://www.slideshare.net/YujiKubota/好きなパッケージは sun.jvm.hotspot2
本セッションで話すことJava12から利用できる機能と変更点Java13以降から利用できる可能性がある機能と変更点話さないこと非互換性git.io/jdk12git.io/jdk11git.io/jdk103
前置き本資料は jdk.java.net からダウンロードできる JDK 12.0.1 および JDK 13 (build 20) で極力動作確認していますが、全ての確認はできていませんのでコードを修正する前に動作確認してください実装は hg.openjdk.java.net/jdk-updates/jdk12u および jdk/jdkで確認しています4
Java128JavaEnhancementProposals(JEP)101Compatibility&SpecificationReviews(CSR)10FixedEnhancementTickets286FixedBugTickets5
JEPs189:Shenandoah:ALow‑Pause‑TimeGarbageCollector(Experimental)230:MicrobenchmarkSuite325:SwitchExpressions(Preview)334:JVMConstantsAPI340:OneAArch64Port,NotTwo341:DefaultCDSArchives344:AbortableMixedCollectionsforG1346:PromptlyReturnUnusedCommittedMemoryfromG16
189:Shenandoah:ALow‑Pause‑TimeGarbageCollector(Experimental)重要度:★☆☆乱暴に言うとConcurrentなEvacuationを持つ非世代別なG1GCG1はライブオブジェクトのCopy時(≒Evacuation)にJavaスレッドを止めて(≒StopTheWorld,STW)オブジェクトのアドレス更新する必要があるが、Shenandoahは関節参照を追加することで常にアドレスを最新の状態に保つようにしてこのSTWを削減したヒープをリージョンに区切って等しく(世代別ではなく)管理してるので、総ヒープサイズに依存することなく一回のGC時間は一定だと期待できる。100GBと2GBで変わらないと良く書かれてるのはこれとはいえゴミが多ければGC頻度が増えて総時間も増えることは普通にある7
Experimental機能。将来的に正式機能となる見込み。RedHatが開発したのでRedHat提供のOpenJDKではProduction‑readyとして入っている現時点で使うとしたらヒープサイズや、プロセスが良く作るオブジェクトの種類に応じて選択することになる以下、個人の所感G1は全リージョンスキャンするタイミングが少ないのでクラスアンローディングなどが苦手ZGCは基本32GB以上前提なのとほぼ全て並列処理なので比較的CPUネックになりやすいParallelは巨大ヒープでSTWが極悪になるShenandoahはG1とZGCのいいとこ取りのようにも見えるがCompressedOops有無や弱参照の比較を見てみたいServiceabilityToolの対応状況も大事8
346:PromptlyReturnUnusedCommittedMemoryfromG1重要度:★★☆未使用のメモリをOSに返すようになったG1のconcurrentmarkcycle時に最大で最小ヒープサイズまで不要なメモリを返すようになったG1の改善型とも言えるShenandoahの取り組みがG1にも反映された-XX:G1PeriodicGCInterval でチェックする間隔をミリ秒で設定できるHotSpotVMは基本的に一度掴んだメモリはOSに返さない振舞いをするので、短い期間しか重い処理を行わないようなプロセスは常駐に不向きだった。このようなケースが解消される9
344:AbortableMixedCollectionsforG1重要度:★★☆MixedGCを中断可能にすることで、ユーザが設定した停止時間の目標値を守りやすくしたG1はヒープをリージョンと呼ばれる単位で管理し、目標値を達成できるようにGC対象とするリージョンのリスト(コレクションセット,CSet)を決定するが、アプリ動作が変わるなどしてCSetが大きくなりすぎて目標値を超過してしまうことがある誤った量のCSetを繰り返し選択した状態を検出してMixedGCを中断可能にすることで、目標値を守れる度合を増やせるようにした検出したら段階的にCSetを選択して実行する10
この改善の際に得られたヒントにより次の改善等がJava13で行われたJDK‑8218668:CleanupevacuationofoptionalcollectionsetJDK‑8219100:Improvedo_collection_pause_at_safepointこのようにGCは継続的に改善が行われていく11
325:SwitchExpressions(Preview)重要度:★☆☆かなり便利なのだがプレビュー版なのでJava12を導入したら即使うものでもない--enable-preview オプションを指定する必要があるフィードバックを得て(いくつか変更を経て)正式に導入される予定Switch「文」が「式」として使用できるようになった条件ごとに変数に代入を繰り返していたが一発で書けるようになった副作用としてbreak抜けなどを防げるので積極的に導入したい12
Beforeboolean isLTS;switch (javaVersion) {case 8:case 11:isLTS = true;break;case 9:case 10:case 12:isLTS = false;break;default:if (javaVersion > 11 && (javaVersion-11)%6==0) {isLTS = true;} else {isLTS = false;}}13
After// 式なので代入可能boolean isLTS = switch (javaVersion) {case 8, 11 -> true; // 複数case, -> で戻り値case 9, 10, 12 -> false;default -> { // 囲めば処理も書けるif (javaVersion > 11 && (javaVersion-11)%6==0) {break true; // break で戻り値指定} else {break false;}}};14
341:DefaultCDSArchives重要度:★★☆何もせずともJavaプロセスの起動時間が短縮されるClass‑DataSharing,CDSとはクラスや文字列などをアーカイブファイルにダンプして複数プロセスで共有する機能JDKのクラスは当然ながら最も共有可能な情報なのでこのアーカイブファイルが提供された、というのがこれクラスローディングが一部省略される等でプロセスの起動時間やメモリフットプリントが削減されるFaaSとか短命プロセスを立ち上げまくるケースで特に有効AppCDSも組み合わせるのが良い15
334:JVMConstantsAPI重要度:★★☆Java10まではprimitiveとリテラルを持つStringだけConstant‑Poolに格納できたJava11から通称 condy と呼ばれる ConstantDynamic がサポートされ、その他もConstant‑Poolで扱えるようになり、かつ定数の初期化処理が必要になるまで遅延可能になったこの遅延効果によりJavaプロセス起動が早くなる16
今回のはこれのJDKAPIの追加java.lang.constant パッケージが java.base モジュールに追加され、定数として使われるであろうクラス群( Integerや Enum 等)が拡張されたLombokなりで対応したいが自作の定数クラスについてもConstable や ConstantDesc インターフェースを実装するのが望ましいかもかも=まだ(私の中で)ベストプラクティスが定まってないこの取組はProjectAmberの一環なのでBrianGoetzの仕様草案(の一部)もとても参考になる17
(APIの変更差分)https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Integer.html18
230:MicrobenchmarkSuite重要度:★☆☆OpenJDK開発者向けであって利用者的には関係なしJavaMicrobenchmarkHarness(JMH)というマイクロベンチマークのフレームワークがOpenJDKコミュニティで開発・提供されているJDKソースコードにこれを利用したベンチマークが追加されたJMHはマイクロベンチマーク時の選択肢の一つとして大変便利(IntelliJプラグインもある)19
340:OneAArch64Port,NotTwo重要度:★☆☆OpenJDKのARM64bitポーティングのコードが重複(arm64,aarch64)してたのでaarch64にマージされた完全にOpenJDK開発者向けであって利用者的には全く関係なし20
APIsすべてのAPI差分はJSR386(Java12のJavaSpecificationRequest)のページから入手できるJSR‑000386JavaSE12FinalReleaseAnnex2forEvaluation21
bitnotableAPIsCompactNumberFormatInputStream#skipNBytesString#indentFiles#mismatchnotableAPIsString#transformCollectors#teeingCompletableFuture#exceptionally{Compose}{Async}22
java.text.CompactNumberFormatJDK‑8177552:CompactNumberFormattingsupportjshell> NumberFormat.getCompactNumberInstance().format(10000)$2 ==> "1万"23
端数どうしてると思います?jshell> NumberFormat.getCompactNumberInstance().format(15001)$3 ==> "2万"jshell> NumberFormat.getCompactNumberInstance().format(14005)$4 ==> "1万"24
java.io.InputStream#skipNBytes(long)指定したバイト数データをskipする既存の skip(long) はskipしたバイト数を返す今回の skipNBytes(long) は指定したバイト数skipできなかったら EOFException を返すエラー時に -1 か Exception のどちらを返すべき?String#indent(int)指定した数分インデントを追加する。マイナスなら削除Files#mismatch(Path,Path)指定した二つのファイルの最初の差分の位置を返す。同じなら -125
String#transform(Function<?superString,?extendsR>f)Stringに対する関数を適用させるメソッド考える順にlambda式で書けるので見通しが良い例:プログラム言語からマスコットのライセンスを取得する言語名からマスコット名を取得するメソッドMascot::getNameマスコット名からライセンスを取得するメソッドMascot::getLicenseMascot.getLisence(Mascot.getName("Java"))"Java".transform(Mascot::getName).transform(Mascot::getLisence)26
Collectors#teeing(Collector,Collector,BiFunction)渡した二つのCollectorの結果をBiFunctionに流す(結合する)一つのデータに複数の処理を同時に加工できるjshell> Stream.of("J","a","v","a"," ","1","2").collect(Collectors.teeing(Collectors.joining(),Collectors.counting(),(x,y)->(x+"の文字数は"+y)))$5 ==> "Java 12の文字数は7"例えばスレッドのリスト対してRUNNABLEなスレッドの名前を列挙しつつ、BLOCKEDなスレッドの個数を","でつなぐと言ったこともできる27
CompletableFuture#exceptionally{Compose}{Async}Exceptionhandlerである exceptionally(Function) メソッドが元々あり、これは前段で例外がスローされたときにキャッチ(して実行)するメソッドこれを非同期に行う Async とthenComposeを行う Compose 、Composeを非同期で行う ComposeAsync が追加されたAsync はForkJoinPoolの管理ワーカで実行される(通常のエラーハンドリング処理はメインスレッドでやる)分かりやすいので CompletableFuture クラスで紹介しているが、実態は CompletionStage インターフェースに追加された28
CompletableFuture.runAsync(() -> {// エラーが生じうる処理throw new RuntimeException();}).exceptionallyAsync(e -> { // ここのパターンが増えた// エラーハンドリング処理return null;}).get(5, TimeUnit.SECONDS);29
OtherenhancementsJDK‑8209923:Unicode11JDK‑8202286:AllocationofoldgenerationofJavaheaponalternatememorydevicesJDK‑8211845:Anewswitchtocontrolverbosityofhs‑errfiles-XX:+ExtensiveErrorReportsJDK‑8205517:JFRtooljfr print --json --category xxx --event yyyzzz.jfrフライトレコードをElasticにjsonで流すなどが可能に30
Java13+ProjectsAmberValhallaPanamaLoomMetropolisSkaraPortolaJEP:35Draft,5Submitted,27CandidateJIRABoard31
ProjectAmberJava言語仕様の大変革動的なクラスファイル定数SymbolicReferencesforConstantsSwitchExpressionRawStringLiterralPatternmatching大きすぎてまとめて入るのではなく少しずつ入ってきてる下2つはJava12に間に合わなかったが一部はAPI追加という形で入ってきてる(String#indentなど)32
ProjectValhalla配列レイアウト改善CPUキャッシュ効率改善に向けた value 型の追加33
ProjectPanamaJVMの外側との連携安全かつ高性能なJNIの置き換えJavaコードとネイティブコードとの連携ForeignFunctionInterface,FFIJavaコードからの低レベルなHW制御Vector演算、不揮発性メモリ34
ProjectLoom軽量スレッドFiberJVMで百万規模のスレッド(Fiber)を動かすマルチスレッドプログラミングの簡易化35
ProjectMetropolisJava‑on‑JavaGraalcompilerAOTstaticcompilation36
ProjectSkarahttps://github.com/openjdk/jdk37
ProjectPortolaPortingtoAlpine/musl38
350:DynamicCDSArchivesJava13で導入予定アプリケーション実行終了時にクラスを動的にアーカイブする仕組みJava12はJDK標準ライブラリクラスのアーカイブが同梱され、この取組でロードされたアプリケーションクラスやライブラリクラスのを自動的にアーカイブすることで、より楽にAppCDSを使えるようになる元々AppCDSを使うには一度クラスをロードさせる必要があるので試運転が必要だった。なおロードされなかったクラスは動作に不要なのでアーカイブされない39
351:ZGC:UncommitUnusedMemoryJava13で導入予定Java12で入ったG1のと同様にZGCも使ってないメモリをOSに返すようになる。ちなみに今のところは返さないShenandoahは最初から返す仕組みが備わっている40
353:ReimplementtheLegacySocketAPIJava13で導入予定(提案レビュー中)SocketAPI( java.net.Socket , java.net.ServerSocket )の一新既存実装はSocketImplのレガシーなSPI(SupportProviderInterface)機構のJavaとCの実装で成り立っており、スレッドスタックをI/Oバッファとして利用していたり、非同期処理をnativeなデータ構造で達成していたりと信頼性や移植性が損ねる状態だった今後ProjectLoomによりユーザモードなスレッド(Fiber)が導入されることもあり、ネイティブな世界でブロックすることなく停止(park)できるように NioSocketImpl が導入される。とはいえ昔の実装も使えるようオプションで切り替えられる予定41
352:Non‑VolatileMappedByteBuffersNVM向けの MappedByteBuffer API追加この流れでunmmapedするAPIも生えないかしら42
301:EnhancedEnumsEnumの拡張。二年前から取組中。Beforepublic enum JDKNumber {YEAR(18),FULL(18.3);public final Number version;JDKNumber(Number version) {this.version = version;}}float jdkVersion = (float)JDKNumber.Full.version;43
Afterpublic enum JDKNumber<T extends Number> {YEAR<Integer>(18),Full<Float>(18.3);public final T version;JDKNumber(T version) {this.version = version;}}float jdkVersion = JDKNumber.Full.version;44
305:PatternmatchingforinstanceofBeforeif (obj instanceof Double) {Double d = (Double) obj;// d を使った処理}Afterif (obj instanceof Double d) {// d を使った処理}switch でも同じように書けるswitch (obj) {case Integer i:// intの時にやらせたい処理case Double d:// doubleの時にやらせたい処理} 45
355:TextBlocksBeforeString html = "<html>n" +" <body>n" +" <p>Hello, world</p>n" +" </body>n" +"</html>n";AfterString html = """<html><body><p>Hello, world</p></body></html>""";46
349:JFREventStreamingこれまでディスクに書き込まれたバイナリデータから解析やモニタリングを行う必要があったが、ストリーミングで流し込むことが可能になる今まで何故なかったのかというぐらい便利。性能次第ではJMXや一部のロギングをこれに置き換えることも十分にあり得る早く来て欲しい47
CatchupJava12andJava13KUBOTAYuji(@sugarlife)LINECorporationJJUGCCC2019Spring(2019/May/18)

Recommended

PDF
Head toward Java 13 and Java 14 #jjug
PDF
明日から使えるgradle
PDF
Migration Guide from Java 8 to Java 11 #jjug
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
OpenJDK コミュニティに参加してみよう #jjug
PPTX
Java EE パフォーマンスTips #glassfish_jp
PDF
Head toward Java 16 (Night Seminar Edition)
PDF
Head toward Java 15 and Java 16
PDF
Prepare for Java 9 #jjug
PPT
Jenkinsプラグイン開発
PDF
Java仮想マシンの実装技術
PDF
JavaOne 2016 Java SE Feedback #jjug #j1jp
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
Java Batch 仕様 (Public Review時点)
PDF
Quarkus による超音速な Spring アプリケーション開発
PDF
システム開発を前進させるためのGradle導入法
PDF
JDK9 新機能 (日本語&ショートバージョン) #jjug
PPTX
Java EE8 Report
PPTX
Jdk9で変更になる(かも知れない)jvmオプションの標準設定
PDF
Jjug 20140430 gradle_basic
PDF
React入門-JSONを取得して表示する
PDF
TDD勉強会キックオフ for Java
PDF
Java 10でぼくたちの生活はどう変わるの?
PDF
REACT & WEB API
PDF
Gradle a new Generation Build Tool
PDF
Integration test with Arquillian and JBoss AS 7
PDF
Sd Loader Seasar Con2009 White
PDF
Unified JVM Logging
PDF
jcmd #javacasual
PDF
HeapStats: Introduction and Technical Preview

More Related Content

PDF
Head toward Java 13 and Java 14 #jjug
PDF
明日から使えるgradle
PDF
Migration Guide from Java 8 to Java 11 #jjug
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
OpenJDK コミュニティに参加してみよう #jjug
PPTX
Java EE パフォーマンスTips #glassfish_jp
PDF
Head toward Java 16 (Night Seminar Edition)
PDF
Head toward Java 15 and Java 16
Head toward Java 13 and Java 14 #jjug
明日から使えるgradle
Migration Guide from Java 8 to Java 11 #jjug
WildFly Swarmではじめる「パーツとしてのJavaEE」
OpenJDK コミュニティに参加してみよう #jjug
Java EE パフォーマンスTips #glassfish_jp
Head toward Java 16 (Night Seminar Edition)
Head toward Java 15 and Java 16

What's hot

PDF
Prepare for Java 9 #jjug
PPT
Jenkinsプラグイン開発
PDF
Java仮想マシンの実装技術
PDF
JavaOne 2016 Java SE Feedback #jjug #j1jp
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PDF
Java Batch 仕様 (Public Review時点)
PDF
Quarkus による超音速な Spring アプリケーション開発
PDF
システム開発を前進させるためのGradle導入法
PDF
JDK9 新機能 (日本語&ショートバージョン) #jjug
PPTX
Java EE8 Report
PPTX
Jdk9で変更になる(かも知れない)jvmオプションの標準設定
PDF
Jjug 20140430 gradle_basic
PDF
React入門-JSONを取得して表示する
PDF
TDD勉強会キックオフ for Java
PDF
Java 10でぼくたちの生活はどう変わるの?
PDF
REACT & WEB API
PDF
Gradle a new Generation Build Tool
PDF
Integration test with Arquillian and JBoss AS 7
PDF
Sd Loader Seasar Con2009 White
Prepare for Java 9 #jjug
Jenkinsプラグイン開発
Java仮想マシンの実装技術
JavaOne 2016 Java SE Feedback #jjug #j1jp
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Java Batch 仕様 (Public Review時点)
Quarkus による超音速な Spring アプリケーション開発
システム開発を前進させるためのGradle導入法
JDK9 新機能 (日本語&ショートバージョン) #jjug
Java EE8 Report
Jdk9で変更になる(かも知れない)jvmオプションの標準設定
Jjug 20140430 gradle_basic
React入門-JSONを取得して表示する
TDD勉強会キックオフ for Java
Java 10でぼくたちの生活はどう変わるの?
REACT & WEB API
Gradle a new Generation Build Tool
Integration test with Arquillian and JBoss AS 7
Sd Loader Seasar Con2009 White

More from Yuji Kubota

PDF
Unified JVM Logging
PDF
jcmd #javacasual
PDF
HeapStats: Introduction and Technical Preview
PDF
OpenJDK トラブルシューティング #javacasual
PDF
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
PDF
JVM のいろはにほ #javajo
PPTX
java.lang.OutOfMemoryError #渋谷java
PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
PDF
Introduction to Java 11: Support and JVM Features #jjug
PDF
Head toward Java 14 and Java 15
PDF
Head toward Java 14 and Java 15 #LINE_DM
PDF
JavaOne 2015 JDK Update (Jigsaw) #j1jp
PDF
JDK9 Features (Summary, 31/Jul/2015) #JJUG
PDF
HeapStats @ Seasar Conference 2015 LT
PDF
楽して JVM を学びたい #jjug
PDF
HeapStats: Troubleshooting with Serviceability and the New Runtime Monitoring...
PPTX
Java 9 and Future #jjug
PPTX
Project Jigsaw #kanjava
PPTX
Secrets of Rock Star Developers (and How to Become One!) [CON7615] (Yuji KUBO...
PDF
オンライン会議と音声認識
Unified JVM Logging
jcmd #javacasual
HeapStats: Introduction and Technical Preview
OpenJDK トラブルシューティング #javacasual
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
JVM のいろはにほ #javajo
java.lang.OutOfMemoryError #渋谷java
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Introduction to Java 11: Support and JVM Features #jjug
Head toward Java 14 and Java 15
Head toward Java 14 and Java 15 #LINE_DM
JavaOne 2015 JDK Update (Jigsaw) #j1jp
JDK9 Features (Summary, 31/Jul/2015) #JJUG
HeapStats @ Seasar Conference 2015 LT
楽して JVM を学びたい #jjug
HeapStats: Troubleshooting with Serviceability and the New Runtime Monitoring...
Java 9 and Future #jjug
Project Jigsaw #kanjava
Secrets of Rock Star Developers (and How to Become One!) [CON7615] (Yuji KUBO...
オンライン会議と音声認識

Catch up Java 12 and Java 13


[8]ページ先頭

©2009-2025 Movatter.jp