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
PRO
May 28, 2019
Technology
0
1.7k
Catch up Java 12 and Java 13
2019/5/28に開催されたLINE Developer Meetup #54 in Fukuokaでの登壇資料です
LINE Developers
PRO
May 28, 2019
Tweet
Share
More Decks by LINE Developers
See All by LINE Developers
LINEスタンプのSREing事例集:大きなスパイクアクセスを捌くためのSREing
line_developers
PRO
1
1.4k
Java 21 Overview
line_developers
PRO
6
800
Code Review Challenge: An example of a solution
line_developers
PRO
1
830
KARTEのAPIサーバ化
line_developers
PRO
1
370
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
PRO
5
1.8k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
PRO
3
1.7k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
PRO
9
2.4k
A/B Testing at LINE NEWS
line_developers
PRO
2
630
LINEのサポートバージョンの考え方
line_developers
PRO
2
790
Other Decks in Technology
See All in Technology
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
300
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
120
DMM.com アルファ室採用案内資料
hsugita
1
160
データベース02: データベースの概念
trycycle
0
160
JSON攻略法.pdf
miyakemito
8
5.1k
生成AIの変革の時代に、直近1年で直面した課題とその解決策
ktc_wada
0
310
アクセシビリティを考慮したUI/CSSフレームワーク・ライブラリ選定
yajihum
2
1k
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
770
Building Dashboards as a Hobby
egmc
0
230
20分で完全に理解するGrafanaダッシュボード
hamadakoji
3
670
自己改善からチームを動かす! 「セルフエンジニアリングマネージャー」のすゝめ
shoota
6
780
MapLibreとAmazon Location Service
dayjournal
1
160
Featured
See All Featured
Unsuck your backbone
ammeep
663
57k
A Philosophy of Restraint
colly
197
16k
Building Adaptive Systems
keathley
31
1.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
The Pragmatic Product Professional
lauravandoore
25
5.8k
Code Reviewing Like a Champion
maltzj
514
39k
Adopting Sorbet at Scale
ufuk
68
8.6k
GitHub's CSS Performance
jonrohan
1025
450k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Bash Introduction
62gerente
604
210k
A better future with KSS
kneath
231
16k
Mobile First: as difficult as doing things right
swwweet
216
8.6k
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)