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
2k
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
3
2.4k
Java 21 Overview
line_developers
6
1.3k
Code Review Challenge: An example of a solution
line_developers
1
1.5k
KARTEのAPIサーバ化
line_developers
1
600
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.3k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.3k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.8k
A/B Testing at LINE NEWS
line_developers
3
1.1k
LINEのサポートバージョンの考え方
line_developers
2
1.4k
Other Decks in Technology
See All in Technology
Agile Leadership Summit Keynote 2026
m_seki
1
410
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
13k
変化するコーディングエージェントとの現実的な付き合い方 〜Cursor安定択説と、ツールに依存しない「資産」〜
empitsu
4
1.3k
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
4.6k
月間数億レコードのアクセスログ基盤を無停止・低コストでAWS移行せよ!アプリケーションエンジニアのSREチャレンジ💪
miyamu
0
800
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
140
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.8k
日本語テキストと音楽の対照学習の技術とその応用
lycorptech_jp
PRO
1
420
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
180
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
160
2人で作ったAIダッシュボードが、開発組織の次の一手を照らした話― Cursor × SpecKit × 可視化の実践 ― Qiita AI Summit
noalisaai
1
370
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
1
190
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.4k
How to Ace a Technical Interview
jacobian
281
24k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
400
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Unsuck your backbone
ammeep
671
58k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Crafting Experiences
bethany
1
46
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
170
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
320
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)