Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Catch up Java 12 and Java 13
Search
LINE Developers
May 28, 2019
Technology
0
1.9k
Catch up Java 12 and Java 13
2019/5/28に開催されたLINE Developer Meetup #54 in Fukuokaでの登壇資料です
LINE Developers
May 28, 2019
Tweet
Share
More Decks by LINE Developers
See All by LINE Developers
LINEスタンプのSREing事例集:大きなスパイクアクセスを捌くためのSREing
line_developers
1
2.3k
Java 21 Overview
line_developers
6
1.2k
Code Review Challenge: An example of a solution
line_developers
1
1.3k
KARTEのAPIサーバ化
line_developers
1
530
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.2k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.1k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.5k
A/B Testing at LINE NEWS
line_developers
3
980
LINEのサポートバージョンの考え方
line_developers
2
1.3k
Other Decks in Technology
See All in Technology
ビズリーチが挑む メトリクスを活用した技術的負債の解消 / dev-productivity-con2025
visional_engineering_and_design
3
6.6k
KubeCon + CloudNativeCon Japan 2025 Recap
ren510dev
1
370
改めてAWS WAFを振り返る~業務で使うためのポイント~
masakiokuda
2
240
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
440
Backlog ユーザー棚卸しRTA、多分これが一番早いと思います
__allllllllez__
1
140
自律的なスケーリング手法FASTにおけるVPoEとしてのアカウンタビリティ / dev-productivity-con-2025
yoshikiiida
1
15k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
18
6.1k
20250707-AI活用の個人差を埋めるチームづくり
shnjtk
4
3.6k
KubeCon + CloudNativeCon Japan 2025 Recap Opening & Choose Your Own Adventureシリーズまとめ
mmmatsuda
0
260
赤煉瓦倉庫勉強会「Databricksを選んだ理由と、絶賛真っ只中のデータ基盤移行体験記」
ivry_presentationmaterials
2
330
ネットワーク保護はどう変わるのか?re:Inforce 2025最新アップデート解説
tokushun
0
180
SmartNewsにおける 1000+ノード規模 K8s基盤 でのコスト最適化 – Spot・Gravitonの大規模導入への挑戦
vsanna2
0
120
Featured
See All Featured
Unsuck your backbone
ammeep
671
58k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.6k
Adopting Sorbet at Scale
ufuk
77
9.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
It's Worth the Effort
3n
185
28k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Scaling GitHub
holman
459
140k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Testing 201, or: Great Expectations
jmmastey
42
7.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Transcript
Catch up Java 12 and Java 13 #LINE_DM version KUBOTA
Yuji (@sugarlife) LINE Corporation LINE Developer Meetup #54 in Fukuoka(2019/May/28)
KUBOTA Yuji (@sugarlife) JVM好き, IcedTea committer / OpenJDK Author WEB+DBで「Dive
to Java」連載中 https://www.slideshare.net/YujiKubota/ 好きなパッケージは sun.jvm.hotspot 2
本セッションで話すこと 以下の重要な部分のみ Java 12から利用できる機能と変更点 Java 13やそれ以降から利用できる可能性がある機能と変更点 話さないこと 非互換性 git.io/jdk12 git.io/jdk11
git.io/jdk10 3
前置き 本資料は jdk.java.net からダウンロードできる JDK 12.0.1 および JDK 13 (build
20) で極 力動作確認していますが、全ての確認はできていませんのでコードを修正する前に動作確認してくだ さい 実装は hg.openjdk.java.net/jdk-updates/jdk12u および jdk/jdk で確認しています 4
Java 12 8 Java Enhancement Proposals (JEP) 101 Compatibility &
Specification Reviews (CSR) 10 Fixed Enhancement Tickets 286 Fixed Bug Tickets 5
JEPs 189: Shenandoah: A Low‑Pause‑Time Garbage Collector (Experimental) 230: Microbenchmark
Suite 325: Switch Expressions (Preview) 334: JVM Constants API 340: One AArch64 Port, Not Two 341: Default CDS Archives 344: Abortable Mixed Collections for G1 346: Promptly Return Unused Committed Memory from G1 6
189: Shenandoah: A Low‑Pause‑Time Garbage Collector (Experimental) 重要度:★☆☆ 乱暴に言うとConcurrentなEvacuationを持つ非世代別なG1 GC
G1はライブオブジェクトのCopy時(≒ Evacuation)にJavaスレッドを止めて(≒ Stop The World,STW)オブジェクトのアドレス更新する必要があるが、Shenandoahは間接参照を追 加することで常にアドレスを最新の状態に保つようにしてこのSTWを削減した ヒープをリージョンに区切って等しく(世代別ではなく)管理してるので、総ヒープサイズに 依存することなく一回のGC時間は一定だと期待できる。 100GBと2GBで変わらないと良く書かれてるのはこれ とはいえゴミが多ければGC頻度が増えて総時間も増えることは普通にある 7
Experimental機能。将来的に正式機能となる見込み。 Red Hatが開発したのでRed Hat提供のOpenJDKではProduction‑readyとして入っている 現時点で使うとしたらヒープサイズや、プロセスが良く作るオブジェクトの種類に応じて選 択することになる 以下、個人の所感 G1は全リージョンスキャンするタイミングが少ないのでクラスアンローディングなど が苦手 ZGCは基本32GB以上前提なのとほぼ全て並列処理なので比較的CPUネックになりや
すい Parallelは巨大ヒープでSTWが極悪になる ShenandoahはG1とZGCのいいとこ取りのようにも見えるがCompressedOops有無 や弱参照の比較を見てみたい Serviceability Toolの対応状況も大事 8
346: Promptly Return Unused Committed Memory from G1 重要度:★★☆ 未使用のメモリをOSに返すようになった
G1のconcurrent mark cycle時に最大で最小ヒープサイズまで不要なメモリを返すようにな った G1の改善型とも言えるShenandoahの取り組みがG1にも反映された -XX:G1PeriodicGCInterval でチェックする間隔をミリ秒で設定できる HotSpot VMは基本的に一度掴んだメモリはOSに返さない振舞いをするので、短い期間しか重 い処理を行わないようなプロセスは常駐に不向きだった。このようなケースが解消される 9
344: Abortable Mixed Collections for G1 重要度:★★☆ Mixed GCを中断可能にすることで、ユーザが設定した停止時間の目標値を守りやすくした G1はヒープをリージョンと呼ばれる単位で管理し、目標値を達成できるようにGC対象とす
るリージョンのリスト(コレクションセット,CSet)を決定するが、アプリ動作が変わるなど してCSetが大きくなりすぎて目標値を超過してしまうことがある 誤った量のCSetを繰り返し選択した状態を検出してMixed GCを中断可能にすることで、目 標値を守れる度合を増やせるようにした 検出したら段階的にCSetを選択して実行する 10
325: Switch Expressions (Preview) 重要度:★☆☆ かなり便利なのだがプレビュー版なのでJava 12を導入したら即使うものでもない --enable-preview オプションを指定する必要がある フィードバックを得て(いくつか変更を経て)正式に導入される予定
Switch「文」が「式」として使用できるようになった 条件ごとに変数に代入を繰り返していたが一発で書けるようになった 副作用としてbreak抜けなどを防げるので積極的に導入したい 11
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; } } 12
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; // break はyield などに変わる可能性あり } } }; 13
341: Default CDS Archives 重要度:★★☆ 何もせずともJavaプロセスの起動時間が短縮される Class‑Data Sharing, CDSとはクラスや文字列などをアーカイブファイルにダンプして複数 プロセスで共有する機能
JDKのクラスは当然ながら最も共有可能な情報なのでこのアーカイブファイルが提供され た、というのがこれ クラスローディングが一部省略される等でプロセスの起動時間やメモリフットプリントが削 減される FaaSとか短命プロセスを立ち上げまくるケースで特に有効 AppCDSも組み合わせるのが良い 14
APIs すべてのAPI差分はJSR 386(Java 12のJava Specification Request)のページから入手できる JSR‑000386 Java SE 12
Final Release Annex 2 for Evaluation 15
bit notable APIs CompactNumberFormat InputStream#skipNBytes String#indent Files#mismatch notable APIs String#transform
Collectors#teeing CompletableFuture#exceptionally{Compose}{Async} 16
java.text.CompactNumberFormat JDK‑8177552: Compact Number Formatting support jshell> NumberFormat.getCompactNumberInstance() .format(10_000) $2
==> "1 万" 17
端数どうしてると思います? jshell> NumberFormat.getCompactNumberInstance() .format(15_001) $3 ==> "2 万" jshell> NumberFormat.getCompactNumberInstance()
.format(14_005) $4 ==> "1 万" 18
String#transform(Function<? super String, ? extends R> f) Stringに対する関数を適用させるメソッド 考える順にlambda式で書けるので見通しが良い 例:プログラム言語からマスコットのライセンスを取得する
言語名からマスコット名を取得するメソッド Mascot::getName マスコット名からライセンスを取得するメソッド Mascot::getLicense Mascot.getLisence(Mascot.getName("Java")) "Java".transform(Mascot::getName) .transform(Mascot::getLisence) 19
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なスレ ッドの個数を","でつなぐと言ったこともできる 20
Other enhancements JDK‑8209923: Unicode 11 JDK‑8205517: JFR tool jfr print
--json --category xxx --event yyy zzz.jfr フライトレコードをElasticにjsonで流すなどが可能に 21
Java 13+ Projects Amber: Java言語仕様の大変革。少しずつ入ってる Valhalla: CPUキャッシュ効率改善に向けたValue Typeの追加 Panama: JNIの置き換え、Javaからの低レベルなHW制御、等
Loom: 軽量なスレッド(Fiber)の導入 Metropolis: Java‑on‑Java, Graal Skara: GitHub へポート (github.com/openjdk/jdk) Portola: Alpine/musl 22
350: Dynamic CDS Archives Java 13で導入予定 アプリケーション実行終了時にクラスを動的にアーカイブする仕組み Java 12はJDK標準ライブラリクラスのアーカイブが同梱され、この取組でロードされたアプリケー ションクラスやライブラリクラスを自動的にアーカイブすることで、より楽にAppCDSを使えるよう
になる 元々AppCDSを使うには一度クラスをロードさせる必要があるので試運転が必要だった。なおロード されなかったクラスは動作に不要なのでアーカイブされない 23
351: ZGC: Uncommit Unused Memory Java 13で導入予定 Java 12で入ったG1の変更と同様にZGCも使ってないメモリをOSに返すようになる。ちなみに今の ところは返さない
Shenandoahは最初から返す仕組みが備わっている 24
353: Reimplement the Legacy Socket API Java 13で導入予定 SocketAPI( java.net.Socket
, java.net.ServerSocket )の一新 既存実装はSocketImplのレガシーなSPI(Support Provider Interface)機構のJavaとCの実装で成り立 っており、スレッドスタックをI/Oバッファとして利用していたり、非同期処理をnativeなデータ構造 で達成していたりと信頼性や移植性が損ねる状態だった 今後Project Loomによりユーザモードなスレッド(Fiber)が導入されることもあり、ネイティブな世界 でブロックすることなく停止(park)できるように NioSocketImpl が導入される。とはいえ昔の実装 も使えるようオプションで切り替えられる予定 25
301: Enhanced Enums 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; 26
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; 27
305: Pattern matching for instanceof Before if (obj instanceof Double)
{ Double d = (Double) obj; // d を使った処理 } After if (obj instanceof Double d) { // d を使った処理 } 28
JEP draft: Pattern matching for switch (Preview) 今後 switch でも同じように書ける予定(別JEPで進行中)
switch (obj) { case Integer i: // int の時にやらせたい処理 case Double d: // double の時にやらせたい処理 } 29
355: Text Blocks 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> """; 30
349: JFR Event Streaming これまでディスクに書き込まれたバイナリデータから解析やモニタリングを行う必要があったが、ス トリーミングで流し込むことが可能になる 今まで何故なかったのかというぐらい便利。性能次第ではJMXや一部のロギングをこれに置き換える ことも十分にあり得る 早く来て欲しい 31
We are hiring (新宿オフィス) サーバサイドエンジニア【LINEプラットフォーム】 https://linecorp.com/ja/career/position/458 32
Catch up Java 12 and Java 13 #LINE_DM version KUBOTA
Yuji (@sugarlife) LINE Corporation LINE Developer Meetup #54 in Fukuoka(2019/May/28)