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
2.1k
0
Share
Catch up Java 12 and Java 13
2019/5/28に開催されたLINE Developer Meetup #54 in Fukuokaでの登壇資料です
LINE Developers
May 28, 2019
More Decks by LINE Developers
See All by LINE Developers
LINEスタンプのSREing事例集:大きなスパイクアクセスを捌くためのSREing
line_developers
3
2.5k
Java 21 Overview
line_developers
6
1.3k
Code Review Challenge: An example of a solution
line_developers
1
1.6k
KARTEのAPIサーバ化
line_developers
1
630
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.3k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.5k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.9k
A/B Testing at LINE NEWS
line_developers
3
1.1k
LINEのサポートバージョンの考え方
line_developers
2
1.5k
Other Decks in Technology
See All in Technology
Modernizing Your HCL Connections Experience: Visual Report to chain, Profile Enhancements, and AI Integration
wannesrams
0
290
サービスの信頼性を高めるため、形骸化した「プロダクションミーティング」を立て直すまでの取り組み
stefafafan
1
250
20260513_生成AIを専属DSに_AI分析結果の検品テクニック_ハンズオン_交通事故データ
doradora09
PRO
0
210
AIと乗り切った1,500ページ超のヘルプサイト基盤刷新とさらにその先の話
mugi_uno
2
310
サンプリングは「作る」のか「使う」のか? 分散トレースのコストと運用を両立する実践的戦略 / Why you need the tail sampling and why you don't want it
ymotongpoo
3
120
古今東西SRE
okaru
1
140
[Oracle TechNight#99] 生成AI時代のAI/ML入門 ~ AIとオラクルデータベースの関係 (後半)
oracle4engineer
PRO
3
240
ハーネスエンジニアリング入門
hatyibei
0
110
国内外の生成AIセキュリティの最新動向 & AIガードレール製品「chakoshi」のご紹介 / Latest Trends in Generative AI Security (Domestic & International) & Introduction to AI Guardrail Product "chakoshi"
nttcom
4
2.1k
Anthropic「Long-running a gents」をGeminiで再現してみた
tkikuchi
0
790
ハーネスエンジニアリング入門
knishioka
0
130
Fabric MCPの紹介と使い分け
ryomaru0825
1
150
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
174
15k
Abbi's Birthday
coloredviolet
2
7.4k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.3k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Producing Creativity
orderedlist
PRO
348
40k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
280
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
160
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
540
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
400
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
The World Runs on Bad Software
bkeepers
PRO
72
12k
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)