SlideShare a Scribd company logo
CatchupJava12andJava13
KUBOTAYuji(@sugarlife)
LINECorporation
JJUGCCC2019Spring(2019/May/18)
KUBOTAYuji(@sugarlife)
JVM好き,IcedTeacommitter/OpenJDKAuthor
WEB+DBで「DivetoJava」連載中
https://www.slideshare.net/YujiKubota/
好きなパッケージは sun.jvm.hotspot
2
本セッションで話すこと
Java12から利用できる機能と変更点
Java13以降から利用できる可能性がある機能と変更点
話さないこと
非互換性
git.io/jdk12git.io/jdk11git.io/jdk10
3
前置き
本資料は jdk.java.net からダウンロードできる JDK 12.0.1 およ
び JDK 13 (build 20) で極力動作確認していますが、全ての確認はで
きていませんのでコードを修正する前に動作確認してください
実装は hg.openjdk.java.net/jdk-updates/jdk12u および jdk/jdk
で確認しています
4
Java12
8JavaEnhancementProposals(JEP)
101Compatibility&SpecificationReviews(CSR)
10FixedEnhancementTickets
286FixedBugTickets
5
JEPs
189:Shenandoah:ALow‑Pause‑TimeGarbageCollector
(Experimental)
230:MicrobenchmarkSuite
325:SwitchExpressions(Preview)
334:JVMConstantsAPI
340:OneAArch64Port,NotTwo
341:DefaultCDSArchives
344:AbortableMixedCollectionsforG1
346:PromptlyReturnUnusedCommittedMemoryfromG1
6
189:Shenandoah:ALow‑Pause‑TimeGarbageCollector
(Experimental)
重要度:★☆☆
乱暴に言うとConcurrentなEvacuationを持つ非世代別なG1GC
G1はライブオブジェクトの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:Cleanupevacuationofoptionalcollectionset
JDK‑8219100:Improvedo_collection_pause_at_safepoint
このようにGCは継続的に改善が行われていく
11
325:SwitchExpressions(Preview)
重要度:★☆☆
かなり便利なのだがプレビュー版なのでJava12を導入したら
即使うものでもない
--enable-preview オプションを指定する必要がある
フィードバックを得て(いくつか変更を経て)正式に導入さ
れる予定
Switch「文」が「式」として使用できるようになった
条件ごとに変数に代入を繰り返していたが一発で書けるように
なった
副作用としてbreak抜けなどを防げるので積極的に導入したい
12
Before
boolean 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/lan
g/Integer.html
18
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‑000386JavaSE12FinalReleaseAnnex2forEvaluation
21
bitnotableAPIs
CompactNumberFormat
InputStream#skipNBytes
String#indent
Files#mismatch
notableAPIs
String#transform
Collectors#teeing
CompletableFuture#exceptionally{Compose}{Async}
22
java.text.CompactNumberFormat
JDK‑8177552:CompactNumberFormattingsupport
jshell> 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)
指定した二つのファイルの最初の差分の位置を返す。同じなら -1
25
String#transform(Function<?superString,?extendsR>f)
Stringに対する関数を適用させるメソッド
考える順にlambda式で書けるので見通しが良い
例:プログラム言語からマスコットのライセンスを取得する
言語名からマスコット名を取得するメソッド
Mascot::getName
マスコット名からライセンスを取得するメソッド
Mascot::getLicense
Mascot.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
Otherenhancements
JDK‑8209923:Unicode11
JDK‑8202286:AllocationofoldgenerationofJavaheapon
alternatememorydevices
JDK‑8211845:Anewswitchtocontrolverbosityofhs‑errfiles
-XX:+ExtensiveErrorReports
JDK‑8205517:JFRtool
jfr print --json --category xxx --event yyy
zzz.jfr
フライトレコードをElasticにjsonで流すなどが可能に
30
Java13+
Projects
Amber
Valhalla
Panama
Loom
Metropolis
Skara
Portola
JEP:35Draft,5Submitted,27Candidate
JIRABoard
31
ProjectAmber
Java言語仕様の大変革
動的なクラスファイル定数
SymbolicReferencesforConstants
SwitchExpression
RawStringLiterral
Patternmatching
大きすぎてまとめて入るのではなく少しずつ入ってきてる
下2つはJava12に間に合わなかったが一部はAPI追加という形
で入ってきてる(String#indentなど)
32
ProjectValhalla
配列レイアウト改善
CPUキャッシュ効率改善に向けた value 型の追加
33
ProjectPanama
JVMの外側との連携
安全かつ高性能なJNIの置き換え
Javaコードとネイティブコードとの連携
ForeignFunctionInterface,FFI
Javaコードからの低レベルなHW制御
Vector演算、不揮発性メモリ
34
ProjectLoom
軽量スレッドFiber
JVMで百万規模のスレッド(Fiber)を動かす
マルチスレッドプログラミングの簡易化
35
ProjectMetropolis
Java‑on‑Java
Graalcompiler
AOTstaticcompilation
36
ProjectSkara
https://github.com/openjdk/jdk
37
ProjectPortola
PortingtoAlpine/musl
38
350:DynamicCDSArchives
Java13で導入予定
アプリケーション実行終了時にクラスを動的にアーカイブする仕組み
Java12はJDK標準ライブラリクラスのアーカイブが同梱され、この取組
でロードされたアプリケーションクラスやライブラリクラスのを自動的
にアーカイブすることで、より楽にAppCDSを使えるようになる
元々AppCDSを使うには一度クラスをロードさせる必要があるので試運
転が必要だった。なおロードされなかったクラスは動作に不要なのでア
ーカイブされない
39
351:ZGC:UncommitUnusedMemory
Java13で導入予定
Java12で入ったG1のと同様にZGCも使ってないメモリをOSに返すよう
になる。ちなみに今のところは返さない
Shenandoahは最初から返す仕組みが備わっている
40
353:ReimplementtheLegacySocketAPI
Java13で導入予定(提案レビュー中)
SocketAPI( java.net.Socket , java.net.ServerSocket )の一新
既存実装はSocketImplのレガシーなSPI(SupportProviderInterface)機構
のJavaとCの実装で成り立っており、スレッドスタックをI/Oバッファと
して利用していたり、非同期処理をnativeなデータ構造で達成していた
りと信頼性や移植性が損ねる状態だった
今後ProjectLoomによりユーザモードなスレッド(Fiber)が導入されるこ
ともあり、ネイティブな世界でブロックすることなく停止(park)できる
ように NioSocketImpl が導入される。とはいえ昔の実装も使えるよう
オプションで切り替えられる予定
41
352:Non‑VolatileMappedByteBuffers
NVM向けの MappedByteBuffer API追加
この流れでunmmapedするAPIも生えないかしら
42
301:EnhancedEnums
Enumの拡張。二年前から取組中。
Before
public enum JDKNumber {
YEAR(18),
FULL(18.3);
public final Number version;
JDKNumber(Number version) {
this.version = version;
}
}
float jdkVersion = (float)JDKNumber.Full.version;
43
After
public 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:Patternmatchingforinstanceof
Before
if (obj instanceof Double) {
Double d = (Double) obj;
// d を使った処理
}
After
if (obj instanceof Double d) {
// d を使った処理
}
switch でも同じように書ける
switch (obj) {
case Integer i:
// intの時にやらせたい処理
case Double d:
// doubleの時にやらせたい処理
} 45
355:TextBlocks
Before
String html = "<html>n" +
" <body>n" +
" <p>Hello, world</p>n" +
" </body>n" +
"</html>n";
After
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
46
349:JFREventStreaming
これまでディスクに書き込まれたバイナリデータから解析やモニタリン
グを行う必要があったが、ストリーミングで流し込むことが可能になる
今まで何故なかったのかというぐらい便利。性能次第ではJMXや一部の
ロギングをこれに置き換えることも十分にあり得る
早く来て欲しい
47
CatchupJava12andJava13
KUBOTAYuji(@sugarlife)
LINECorporation
JJUGCCC2019Spring(2019/May/18)

More Related Content

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

What's hot (19)

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

Similar to Catch up Java 12 and Java 13 (20)

PDF
PDF
これからのJDK/JVM 何を選ぶ?どう選ぶ?
PDF
All I learned while working on a Scala OSS project for over six years #ScalaM...
PPTX
120517 revert tomcat7
PDF
JDKの選択肢とサーバーサイドでの選び方
PDF
R5 3 type annotation
PDF
Gradleプラグインを作成してみた
PDF
Gws 20120521 gradle
PDF
[JavaOne Tokyo 2012] JavaFX and Web Integration
PPTX
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
PDF
SDLoader SeasarCon 2009 Whire
PPT
2012年javaメモリリーク
KEY
Inside frogc in Dart
PPTX
Serviceability Toolsの裏側
PPTX
Java をクラッシュさせて遊んでみよう!
PDF
JSUG勉強会 2018年その5 Spring I/O 報告会
PPTX
Introduction to GraalVM
PDF
Quarkus入門
PDF
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
PPTX
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
これからのJDK/JVM 何を選ぶ?どう選ぶ?
All I learned while working on a Scala OSS project for over six years #ScalaM...
120517 revert tomcat7
JDKの選択肢とサーバーサイドでの選び方
R5 3 type annotation
Gradleプラグインを作成してみた
Gws 20120521 gradle
[JavaOne Tokyo 2012] JavaFX and Web Integration
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
SDLoader SeasarCon 2009 Whire
2012年javaメモリリーク
Inside frogc in Dart
Serviceability Toolsの裏側
Java をクラッシュさせて遊んでみよう!
JSUG勉強会 2018年その5 Spring I/O 報告会
Introduction to GraalVM
Quarkus入門
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Ad

More from Yuji Kubota (20)

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

Catch up Java 12 and Java 13