Java Day Tokyo 2017に参加してきたのでその時のメモ。
今回はJavaSE9について重点的に聞いてきました。
自分用に書いていたので歯抜けが多く申し訳ないです。
間違いや補足事項あればご指摘いただけると幸いです。
Java Day Tokyo 2017 とは
日本オラクルが開催する、国内最大規模のJava年次イベント。
公式ページ:http://www.oracle.co.jp/events/javaday/2017/
ハッシュタグ: #JavaDayTokyo
参加したセッション
※敬称略
- 基調講演 (日本オラクル代表執行役社長 杉原博茂、Oracle Vice President Bernard Traversat、Oracle Senior Director Will Lions)
- Java 9 and Beyond: Java Renaissance in the Cloud(Oracle Vice President Bernard Traversat)
- Modular Development with JDK (日本オラクル株式会社 デイビッド・バック)
- Servlet 4.0 で始めるHTTP/2(日本オラクル株式会社 柳原 伸弥)
- Java SE 9のすすめ (Java in the Box 櫻庭 祐一)
- Spring Framework 5.0によるReactive Web Application (Pivotalジャパン株式会社 槙 俊明)
発表資料:https://www.slideshare.net/makingx/spring-framework-50-reactive-web-application-javadaytokyo
トピック&まとめ
◆Javaの現状、今後の動向について
- Java SE 9, Java EE 8がリリースされる
- Claud上で最適化するための機能強化
◆今年7月にリリース予定のJava SE 9, Java EE 8について
- Java SE 9については後述。Java EE 8についてはあまり聞けなかったため言及しない。
◆Java SE 9 で導入される、module(Project jigsaw)とその他の新機能について
- Module System(Project jigsaw):最も注目されている機能。依存性をモジュール単位で設定可能とする。
- JShell:PythonやRubyのREPLのように、インタラクティブにコードを実行する機能。
- JLink:JDKのクラスモジュールのうち必要なものだけ指定して読み込むことができる機能。
- Ahead of Time Compilation(AOT):仮想マシンの起動前にJavaクラスをネイティブコードにコンパイルする機能。起動時の時間短縮。
- G1GC:デフォルトのGCが、パラレルGCからG1GCに変更された。
◆Java SE 9 で発生した仕様変更について
- Milling Project Coin (参考:http://itpro.nikkeibp.co.jp/atcl/column/15/120700278/050800037/?rt=nocnt)
- イミュータブルなコレクションが作成可能になる。(Collectionインターフェースのofメソッド)
- Stringの内部実装がchar[]→byte[]に。Heapの使用量がかなり減る。
◆Servlet 4.0 で対応するHTTP/2について
- HTTP/2を利用することで、クライアントとのHTTP通信が高速化可能に。Servlet 4.0 を素で使うのはあまり実現的でないので、フレームワーク側に対応動向をチェックしておく。
◆Spring Framework 5.0のReactiveプログラミング対応
- Spring Framework 5.0より、Reactiveプログラミング対応としてSpring WebFluxという新しいWebフレームワークが追加された。
- Reactiveプログラミングを行うと、Non-Blockingなデータ通信により高速化、柔軟なスケーラリビティが期待できる。
- RxJava, Reactor, Akka などのライブラリが有名どころ。JavaSE9ではFlowインターフェースによるReactiveプログラミング対応が行われている。
以下、各セッションのメモ
Java Day Tokyo 2017 基調講演 (日本オラクル代表執行役社長 杉原博茂、Oracle Vice President Bernard Traversat、Oracle Senior Director Will Lions)
概要(公式ページより)
いよいよJava SE 9とJava EE 8のリリースが近づいてきました!今回のJava Day Tokyoの基調講演は、Java SE、Java EEそれぞれの開発部門のVice Presidentが、直接みなさまへ新バージョンの価値をご紹介します。新バージョンの注目すべきポイント、さらにその先に何があるのかを、ぜひみなさまご自身でお確かめください。ご参加をお待ちしています。
日本オラクル代表取締役 杉原博茂 氏
- 「日本を幸せにするカンパニーへ」
- ITの人材不足が課題、2030年には60万人の不足に
- オンプレ(12兆) > IaaS(2100億)
- Cloud上で最適化するための機能強化
Oracle Vice President Bernard Traversat 氏
- Cloudの基盤となる
- AWS,MS AzuleなどのコアにJavaが使われている
- Java is deadはOracleに買収されて払拭された
- 先日、Dockerとのパートナーシップを発表した
Java9
- 122のフィーチャーが入った
- module system
- modular JDK
- JShell
- Encapsulate Internal APIs
- JLink: Java Linker
- Ahead of time compilation(AOT)
- Java9ではスタティックのコンパイレーションを利用可能
- コンパイラがリアリタイム情報を取得可能に
Java9以降の動向(OpenJDK)
project Valhalla
- ValueTypes
- Specialized Generics
- Var Handles
Project Panama
ビッグデータへの適用
GPUでの実行
- Foreign Function Inteerface
- Date Layout Control
- Arrays 2.0
MazdaでのJavaの利用について
従来型
- ビジネスプロセスをサポート
- 機能要件・非機能要件をサポートするのは必須
- 全ての開発者は共通の開発環境、アーキテクチャ、開発ルール、FWを使っている
- 自動生成ツールを作成
- 言語が長生きしてくれるのも重要
- 下位互換性(バージョンアップしやすい)
最近の流れ
- 組み合わせ
- Strategy Pattern →関数型に
- 期待
- 開発環境やFWの共通化→肥大化→Jigsawに期待
- 大量データ→GCの問題→BigData/AI時代のJavaに期待
JShell
- REPLのようにインタラクティブに実行可能となる
- mvn jshell compile
- 補完機能もついている
- プロトタイプをJShellで作成し、形ができてきたらコードに落とし込む
Oracle Senior Director Will Lions 氏
- JavaEE8は早ければ今年の夏に発表予定
- HTTP/2は速度が速くセキュア、アプリケーションに変更必要なし
JJUG
- 現在6300人以上、コアは20-30代
- なぜコミュニティに参加するのか
- 一緒に考えてくれる仲間に出会える
- すごいエンジニアを知ることが出来る
- 発信して勉強できる
Java 9 and Beyond: Java Renaissance in the Cloud
概要(公式ページより)
本セッションはJava 9リリースのアップデート情報をお届けします。Java 9は、エンジニアがjavaサービスをクラウド上にjavaサービスを開発し展開する方法を根本的に変えます。新たなツールであるAOTやJLinkはJava 9の新モジュールシステムを活用して新しいタイプのパフォーマンスと密度の最適化を可能にします。Java 9でデフォルトGCに位置づけられたG1はビッグデータクラウドサービス向けの新たなレベルのスケーラビリティを提供します。さらに、value typeやJNIの移行、言語の改良など、Java 9以降の新機能についても触れたいと思います。またこのセッションでは、これら新機能のデモを通してクラウドベースの開発者にとってのJava 9の重要性を理解頂きます。
Java9
- Javaの問題
- 冗長性
- メモリを食う
- Javaの優先度
- セキュリティ
新機能
- jigsaw
- JLink
- Ahead of Time(AOT) Java Compiler
- JShell
- G1 GC as the Default
Java SE Advanced
- Flight Recorder Performance
- 条件に基づいた情報をトレーシングすることが可能
- Java Mission Control Console
- 問題箇所を調査することが出来る
- Advanced Management Console
- 特定のアプリだけ古いJavaを利用、などを設定できる(セキュリティの向上)
Java9以降の動向
- Uniform
- Array, Values, types
- memory
- なるべくコンパクトに、もっとライトウェイトなスレッド
- Compatible
- 互換性
- Performance
- CPU/GPU
Modular Development with JDK 9 (日本オラクル株式会社 デイビッド・バック)
概要(公式ページより)
モジュラー開発スタイルは全てのJava開発者(あなたのアプリケーションがたった1つのJARであっても100個のJARであっても)にメリットがあります。本セッションでは内部APIを強力に保護しながら数十の再利用可能なモジュールとしてJDKを構造化したJava 9のモジュールシステムを紹介します。
そして、セッションではモジュールをどのようにして作成するか、一般的に利用されているライブラリ潜むJDKの内部APIへの依存の回避をどのように行うかについて解説します。最後に、モジュールのために用意されたツール群について説明します。
Programs are Classes Package Mogules
exports はパッケージ単位。requires はモジュール単位
JLinkを利用すると、JDKのクラスモジュールのうち必要なものだけ指定して読み込むことが出来る
→メリットは?
cloudなどで多数のJDKを起動する場合などに、リソースの節約になる
jdepsでjarの依存関係を検査することができる(Java8から提供されている)
Automatic Modules
既存のJarを自動的にmodule化する機能
モジュールベースで開発されてないものは、Automatic modules機能を使う。Jarの変更なし
Servlet 4.0 で始めるHTTP/2 (日本オラクル株式会社 柳原 伸弥)
概要(公式ページより)
HTTPの仕様が16年ぶりにHTTP/1.1 からHTTP/2に更新され、通信効率を向上するさまざまな仕組みが取り込まれました。Servlet 4.0では、HTTP/2の活用するアップデートが行われています。本セッションでは、Servlet 4.0を用いたHTTP/2 の活用例についてご紹介します。
Servlet振り返り
- サーバサイドで動作するJava
- Controllerとしての役割
Servlet4.0概要
- Servlet4.0 2017/7リリース予定
- HTTP2対応
HTTP/2概要
- 1系
- TCPコネクションについて、リクエスト・レスポンスが1:1
- 原則として1つのリクエストの完了を待ってから、次のリクエストを送信→待ちが発生
- 高速化の取り組み
- CSSスプライト
- インラインイメージ
- ドメインシャーディング
- 2系
- TCPコネクションについて、ストリームの多重化
- ストリーム優先度
- Server Push
- ヘッダー圧縮(オーバーヘッドを少なくする)
- バイナリー・フレーム(今まではテキストベースだった)
Server Push
- 一つのリクエストに複数のレスポンスを返す
- PushBuilderオブジェクトを作成 (request.newPushBuilder();)
- PushBuilderオブジェクトは再利用可能
- GETまたはHEADを利用する(「キャッシュ可能」かつ「安全」であること(RFC 7540の仕様に準拠))
- JSファイルの結合や、CSSスプライトを行う必要がなくなる
Java SE 9のすすめ (Java in the Box 櫻庭 祐一)
概要(公式ページより)
Java SE 9というと、Project JigsawやJShellを思い浮かべるかもしれません。しかし、Java SE 9はそれだけではありません。Java SEの機能追加を定めるJEPの数は89もあります。
本セッションでは、Java SE 9の多くの新機能の中から言語仕様の変更や、コアライブラリの変更点、また互換性に問題がある点などについて実例と共に解説します。
Jigsaw, JShellの話はしない
アジェンダ
- Compatibility
- Brand new
- Update
Compatibility
- Language & Library
- アンダースコアのみの変数名は使用できなくなった
- 消えたメソッド
- OSに直結するようなメソッドは隠蔽された(Jigsaw絡み)
- deprecated
- threadのStop
- Reflection系のメソッド
- VM&Tools
- No More Java Plug-in Applet
- No More Windows x86 Clinent VM
- No More Java DB
- Operation & Management
- No More Visual VM
- No More hprof(heapのプロファイラ), jhat
- JRE Structure
- ディレクトリ構成が変わった
- No More rt.jar, tools,jar, lib/ext
- No More -Xbootclasspath
- Default GC: G1GC (今まではパラレルGC)
- Deprecated: CMS(GCの一種)
Brand New
- Jigsaw
- Project Kulla/JShell
- Reactive Streams
- 非同期プロセス
- Publisher-Subscriver Model (w / Back Pressure)
- Flowインターフェース
- Publisher
- Subscriber
- Subscription
- JEP11 Incubator Modules
- ベータ版のような機能をJDKに含める
- Java SE 9 : HTTP/2 Client
- ベータ版のような機能をJDKに含める
Update
- Language: Milling Project Coin
- @SafeVarargs
- try-with-resources
- finalのついた変数ならばtry句に使用可能に(実質的finalでもOK(Java8より))
- ダイヤモンド演算子(<>)
- 匿名クラスでも利用可能に
- Interfaceでprivateメソッド
- アンダースコア
- Library
- Stream
- Factory Methods
- ofNullable(t)
* - iterate(seed, hasNext, next)
- 条件とつけられるようになった(今までは無限イテレート)
- ofNullable(t)
- New Methods
- take/dropWhile
- Collectors.flatMapping
- Collectors.filtering
- Factory Methods
- Optional
- stream()
- ifPresentOrElse(action, elseAction)
- or(supplier)
- Optional opt = opt1.or(() -> opt2)
- Collection
- Factory Method
- of()
- List l = List.of(0,1,2);
- Map m = Map.of(0,”a”,1,”b”);
- of()
- Making Immutable Collection
- Enumeration.asIterator();
- Factory Method
- String
- char[] → byte[]
- heapの使用量がかなり減る
- concatenation
- StringBuilder → InvokeDynamic
- 最適化が可能に
- StringBuilder → InvokeDynamic
- char[] → byte[]
- Deprecated
-
@Deprecatedのついたものは本当に消される
- Deprecatedの警告が出た場合はすぐに対応すべき
-
@Deprecatedのついたものは本当に消される
- Javadoc
- HTML5対応
- SearchBox
Spring Framework 5.0によるReactive Web Application (Pivotalジャパン株式会社 槙 俊明)
概要(公式ページより)
Spring Framework 5.0の目玉機能としてReactiveプログラミング対応が加わり、Spring WebFluxという新しいWebフレームワーク及びランタイムが追加されます。
本セッションでは、Reactive対応の背景とReactive Streams/Project Reactorの説明から入り、Spring Boot 2.0を交えたSpring WebFluxの使い方をコード例を中心にご紹介します。
発表資料
Reactiveとは?
- Non-Blocking
- event-driven
- backpressure
種類
- Sync/Bloking
- Async & Blocking
- マルチスレッド
- スレッドを立ち上げる処理が重い
- マルチスレッド
- Async & Non-Blocking
- Event-Loop
- I/Oの待ち時間を有効に利用できる
- Servletを使うと必然的にBlockingになる
- Nettyを利用するとNon-Blocking & Event-Loop (Apple, Twitterなどで利用されている)
SpringがReactive対応する理由
- マイクロサービス→無駄なくスケール可能に
- スロークライアントからのアクセス
- スケーラビリティ・安定性など
Reactive Streams
- non-blocking
- back prassure
- データの流量を調節する機構
対応ライブラリ
- RxJava
- Reactor
- Acca Stream
Reactorの場合
Flux/Mono
- Flux
- Publisherの実装0~N件のデータを表現する場合に使用
- Mono
- Publisherの実装 0または1のデータを表現する場合に使用