【勉強会メモ】JavaOne 2017 報告会 in 大阪
日時:2017/10/28(土) 13:00 〜 18:00
場所:日本オラクル株式会社 関西支社
毎年サンフランシスコで開催されているJavaOneの報告会。実際に現地で参加してきた方々によるJavaの最新動向。タイミング的にJDK 9の話が中心だと思ってはいたが、リリースが延期される間に主要な機能については関ジャバでも既に取り上げていたこともあり1つ1つの詳しい解説は少なめ(Moduleぐらい)だった。
Javaエンジニアの関心事としては今後のリリースサイクルとOracleのサポート、技術的にはModuleどうすんねん?というあたりだろうか。今まで1,2年単位で新機能に追従していたのに、半年のサイクルに追従できるのかというのは少し不安ではある。従来のリリースモデルからの移行期間もそれほど猶予があるわけではないので、まずは影響の大きそうなModuleにどう対応するかが大きな課題になりそう。さらに半年単位で新たな機能も入ってくるので今後の動向にも注意が必要。
ポジティブな面ではコンテナ技術への対応は期待感があった。fn projetは簡単に試すことができるので触っておきたい。Persistent Memoryについても今後のサーバサイドJavaのあり方に影響を与えそうなので動向を見守りつつ抑えておきたい技術だ。
Graal/OpenJ9についてはちょっと理解が追いついておらず粗いメモになっている気もしますがご容赦ください。長丁場の勉強会の最後にこのテーマは正直しんどかった。。
JavaOne 2017 overview & announcements(伊藤 敬さん)
伊藤 敬さん(日本オラクル株式会社)
Java One 2017 Event Schedule
Java Kyenote
- Mark Cavage…Java SEとEEの開発トップ
- 去年就任してから色々動きがあった
- もともとAWSにいたりEaasの人
- EEとSEをうまくまとめている
- Georges Saab…EE
- Mark Reinhold…SE
これからのJavaの方向性
- Open
- Evolving
- Nimble…軽量化
- Scalable
- 8がリリース
- さらなるOpen化
- 軽量性
- Eclipseへの移行
Java SE
- OpeJDK活用
- リリースサイクルの高速化
Announcement New Release Model of JDK
従来のリリースモデル
- JDK 9⇒過去最多の機能追加
- 従来のリリースモデルは2年に一度を目標
- 機能リリース
- 実際は2年以上かかっている
- SE8は9ヶ月遅れ
- SE9は計画発表時で既に6ヶ月遅れ、最終的に1年7ヶ月遅れ
- 1年間のサポート
- 実際は2年以上かかっている
- 更新リリース(セキュリティパッチ)
- Oracle製品は全部3ヶ月ごと(1月、4月、7月、10月)
- 長期サポート
- OcaleJDKは1年以降も長期サポート
- OpenJDK
- ソースコードで提供、研究目的的な位置づけ
新しいリリースモデル(JDK9から開始)
- 機能リリース⇒6ヶ月に一度のリリースに固定
- OpenJDK
- 更新リリース:3ヶ月ごと⇒サイクルは今まで通り
- OpenJDK & OracleJDK
- メンテナンスのみで機能更新は行わない
- 長期サポート(LTS、有償)⇒18年9月から開始
- Olacle JDKのみ
- 3年ごとの機能リリースをサポート
ソースコードの管理モデル
- 従来のモデル
- 新しいモデル
- JDK 9⇒18.3⇒18.9⇒19.3...
- 18.9 LTS商用サポート(26年9月まで)
- 21.9 LTS商用サポート(29年9月まで)
Java SE 18.3のスケジュール
- 2017/12/14⇒Rampdown Phase One
- 2018/1/11⇒All Tests Run
- 2018/1/18⇒Rampdown Phase Two
- 2018/2/22⇒Final Release Candidate
- 2018/3/20⇒General Avilability
公式アップデート終了スケジュール
- SE 8⇒2018年9月…ここを目指してモジュール対応し18.9に向けて対応するのが現実的かも?
- SE 9⇒2018年3月
- SE 18.3⇒2018年9月
新しいリリースモデルに伴う変更
- Java SE 8 から後継バージョンへの自動更新は行われない
- Java SE 9 の32ビット版のバイナリ提供の予定は無い
- Java Plug-inおよびJava Web Startのサポート期間はJava SE 8まで
- 無償は18年3月まで、有償は19年3月まで
- Java SE 18.3からはバンドルされない
Javaの商用サポート
SE 8⇒Premier:22/3、Extend:25/3 SE 8 Deployment Technology⇒Premier:19/3 SE 9 ⇒Premier:18/3、Extend:設定なし 18.3 ⇒Premier:18/9、Extend:設定なし 18.9 ⇒Premier:23/9、Extend:26/9
Java SE 9 日本語ドキュメント公開済み
Java EE 8
Java One 2018
2018年は10/28〜11/1予定
HeapStatsとProject Jigsaw
久保田 祐史さん
www.slideshare.net
Web+DB Press vol.101のJava9 のModuleの記事を執筆
- 作者: 森本利博,武井優己,SPY,久保田祐史,大倉香織,石川雅之,袴田類,山下和彦,牧大輔,穴井宏幸,加藤隆一郎,加藤佑典,金昌熙,佐藤健太,のざきひろふみ,うらがみ,久田真寛,ひげぽん,池田拓司,はまちや2,竹原,牟田裕太郎,粕谷大輔,陶山嶺,長谷川智希,石田和太郎,小林純一,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2017/10/24
- メディア: 大型本
- この商品を含むブログを見る
HeapStats
Project Jigsaw
- JAR HELL⇒依存性が複雑怪奇
- 標準ライブラリ⇒巨大かつ分割不可
- 紛失したライブラリはどれ?
- コンフリクトがどこで発生?⇒依存性を定義できないのが問題
- 内部APIを安全に変更できる?⇒内部だけで使いたいけどPublicにしないといけない
- PublicがPublic過ぎる
⇒解決策を測るのがProject Jigsaw
Module⇒パッケージが入っているコンテナのようなもの
module-info.java
の定義
- モジュールの依存関係
- 公開するパッケージと公開先
標準ライブラリもモジュール化
モジュールの確認や使用
jdeps
コマンドで依存性を確認可能module-info.java
の雛形を作成も可能⇒たくさんのパッケージに公開する時などに漏れがなくなる
jlink
でライブラリ化
デモ
src/
配下にModule- Moduleごとに従来の構成でパッケージを配置
- Moduleもパッケージ同様ユニークな名前にする
- どのモジュールのどのクラスを実行するかを指定して実行
jlink
でライブラリ化- Javaが入っていない環境でも実行可能
- 今後はコンテナで実行しやすくする
Q:モジュール名もユニークにするとあったがパッケージ名のようにドメインのような形になるのか?
A:YES 構成的にはパッケージ名の下にまたパッケージ名が入るイメージ
アンチパターン
classpath
とmodule(path)
を同時に指定してはいけない- 実行はできるが、エラーがわけわからなくなる
- モジュール化していないライブラリをmoduleパスで呼び出すことはできる
- モジュール化するまではclasspathで指定するほうがおすすめ
3年目のJavaOneぐらい大目にみてよ
佐々木さん
- JavaOne2017で登場したライブラリやツールの紹介
- JavaOne2015からJavaOne2017まで3回の参加で得た経験や感想について
Ten Simple Rules for Writing Great Test Cases
www.slideshare.net
- Think before you act⇒まずは考える
- Make your test understandable⇒テストはわかりやすいように
- テストされるコードよりテストコードをわかりやすく
- コメントをたくさん書く
- 失敗時の理由が分かりやすいように
- Keep your test small and simple⇒テストは小さく単純に
- Test one thing only⇒テストは1つずつ
- Fast test only⇒テストの実行時間は短く
- ユニットテストはなるべく頻繁に実行する
- 結果がすぐわかるように
- 遅いテストは頻繁に実行したくない
- Absolute repeatability⇒テストはいつも同じ結果になるように
- Independent test only ⇒テストは他のテストに依存しないように
- どんな順番でテストを実行しても同じ結果になるように
- 一部のテストのみを実行して素早くデバッグできるように
- Provide diagnostic data on failure⇒テスト失敗時の状況を出力する
- No hard-coding of your environment⇒環境をハードコートしない
KISSの原則
- Keep it simple, stupid
- Keep it short and simple
⇒テストコードにかぎらずシンプルにしておくことは重要
Compiling Java to JavaScript How to Replace Applets Without the Plugin
Session Catalog | JavaOne 2017
Javaでゲームのような画面でプログラミングする
TeaVM
- JavaからJavascriptへのトランスパイラ
- VMではない
- マルチスレッドをサポート
- Lambdaを含む全ての言語構造をサポート
- 主要なJavaAPIクラスを実装
- バイトコードからJavascriptに変換
- JavaにかぎらずScalaやKotlinからも変換可能
トランスパイル
- トランスパイルは完璧ではない
- AppletをHTML5アプリに変換したいときに試してみてもいいかも
3年目のJavaOne
ホテルの予約
- サンフランシスコは平均宿泊料金が世界一
- JavaOne開催期間は値段が跳ね上がる
- ホテルは早めに予約⇒ほぼ1年前
英語
- ほとんどのセッションはスライドがある
- 基本的な技術バックボーンがあれば理解しやすい
- 日常生活のほうが大変
- バーボンが通じない⇒銘柄を言っていくことでありつけた
2年目はU.S Citizensで入国審査できる
- 到着した日の過ごし方で全てが決まる⇒野球を観て過ごす
- 到着した日は晩まで寝ない
- バーボンをリベンジ⇒1回の発音で通じた(ブーブン)
- ⇒ダイキリが通じなかった⇒違うバーで翌日リベンジ成功(ダイキュリー)
3年目も晩まで寝ない
- カリフォルニア科学アカデミーに行く
- 戦争記念オペラハウスに行く(オペラのシーズンらしい)
- Google Mapに周辺の食事のマップ
- バーでアメリカ人と友達になる
JavaOneで感じたJavaの今とこれから
きしださん
Javaが変わった
OpenJDK ライフサイクルおよびサポートポリシー - Red Hat Customer Portal
18.3にvarが入る
- 言語仕様ですら6ヶ月でかわる
- なにが変わるか事前に把握しづらい
- なにが変わったか事後に把握しづらい
- なにが動かせるか把握しづらい
fn project
fn projet は簡単に試せる
※メモ qiita.com
サーバレス
- 要するにCGI
- ゲートウエイだけが立っていてアプリケーションはその都度プロセスを動かす
- サーバ管理の必要性が低い
- スケールアップが容易
- 多重化はしたいけど不可はそう高くないみたいなところにいいかも
- 企業規模が多ければ案外多いのでは
Javaの欠点
- プロセス起動が重い
- 一度しか実行されないので実行時最適化が無駄
プロセス起動が重い
- 読み込むクラスを減らす⇒モジュール化
- 実行時の最適化が無駄⇒予め最適化⇒AOTやOpenJ9
色々変わるけどモジュール化が大事
- プロジェクトごとにリリース可能
- Dockerに対応しやすくなるのもモジュール化によって実現
JUnit5
- 再設計した
- だいぶ便利になった
- Nestedが便利⇒見やすく書ける
- メタアノテーション⇒tagを使って書きやすくなった
- パラメタライズテスト⇒パラメータを変えたテストが書きやすくなった
Intel's Persistent Memory in Java Platform
きつねさん
IntelとOpenJDK
Persistent Memory(PM)
- Oracle Database 18c でPMサポート
- OOW'17でアナウンス⇒5倍ぐらい早くなる
PM in Java
- Volatile usage
- 大容量量メモリ
- Persistant usage
- 高速ストレージ
2 kind of Volatile Usage
1 DAXでPM上の仮想アドレス空間に配置(全部PMに載せる)
- 割り当て方を考えなくて良いので簡単
- メモリアクセス速度<大容量メモリの場合に有効
例) - BigData - In-memory db
java実行時のオプションで指定できるようにする予定
2 一部をDRAMに乗せて残りをPM
- ユーザーが割当を指定
- プロファイリング結果をもとに自動で割り当てて最適化
- ⇒実際に自動でやるにはまだ難しいので割当指定が現実的
-Xmp500g
のようにオプション指定- 以降はPM使うというようなコードも書ける
Persistent(Storage) usage
Persistent Collections for Javaを使ったデモ
-ObjetDirectory - putでオブジェクトを永続化 - getでクラスを指定して取得 - 永続化しているので違うJVMでもgetで取得できる - Transaction - 永続化のトランザクション制御 - サンプルはRAMディスクを使ってエミュレートする
永続化可能なクラス定義
⇒永続化されているオブジェクトを取得後にオブジェクト内の値を変更すると永続化されたObjectDirectory上のオブジェクトの値も変わる
まとめ
- IntelがめちゃくちゃJavaに力を入れている
- メモリとして使うほうは早くJavaでも使えるかも
- ストレージとして使うAPIはPanama待ち
- APIは今でも試せる
- RAMデスクでエミュレート
- 対応するOSS DBが出て来るのはもう少し先かも
JVM関連の最近の出来事 Graal/OpenJ9
じゅくちょーさん
www.slideshare.net
Graal
Twitterが既に利用
- すでに本番環境でGraal使っている
- OpenJDK8ベースの独自JDKを使っている
Graal VM
JVM上で他の言語が動いている
- Graal VM上の言語は相互に呼び出し可能
Truffle
- 言語実装要フレームワーク
- ASTインタプリタとして言語を実装できる
- JVM言語以外はTruffleを通じてインタープリタを作る
- C,C++,FortranはさらにLLVMが間にはいる⇒Sulongというのがある
オレオレ言語をTruffleで動かす⇒JJUG CCCで続きをやる予定
Graal & Truffle
パフォーマンス
まとめ
OpenJ9
JVMの実装
など
⇒JavaエンジニアとしてはJVMの実装もアプリケーションに合わせて実装したい
OpenJ9
J9の特徴
などなど
OpenJ9はOMRを使用する
Eclipse OMR
OpenJ9ではクラスファイルを扱いやすくなっている
Conversion to ROM
- J9がROMクラスに変換している
- プラットフォームに合わせてROMクラスができる
From ROM to RAM
- 書き込むときにはRAMに変換
クラス共有
- JVMをまたいでROMクラスを共有
- 起動が早い
- フットプリントが小さい
J9のパフォーマンス
- スタートが35%早くなる
など
Ahead-Of-Time(AOT)コンパイル
- OpenJDK/OracleJDK9にexperimentalで含まれる
- Linuxのみ
jaotc
コマンド
Startup time
- AOTを使うと早くなる
J9のツール
DDR(Direct Dump Reader)
- J9用コアダンプ解析ツール
- DDR Interactiveというフロントエンドもある
Open J9ではできなさそう
DDRが提供すること
- そのアドレスの構造を出力する
- その他の情報を出力する
- ユーティリティ
- データ解析
⇒GDB弱者にはやさしいかも
まとめ