今年もJava Day Tokyo 2014に参加してきました。
4月あたりにOracleのサイトで受講予約して、メールされた受講票のプリントと名刺を当日会場に持っていくだけ。参加無料です。
英語のセッションには同時通訳が付き、イヤホン付きトランシーバで聞けます。
参加したセッションは下記の通り。
- 基調講演(K-1)
- Java SE8概要(A-1)
- Java SE8におけるHotSpotの進化(C-2)
- Javaアプリケーション開発におけるテストとTDDの実践(C-3)
- Lambda式とストリームAPI、並列処理の詳細(A-4)
個人的にメモってるものだけ、まとめていきます。
(よくわからなかったところはよくわからないままになっていますし、私の脳みそを通しているので不正確です。)
基調講演前
Java8を象徴するムービーが流れてました。
PermGenがなくなりますよーとかDate and Time APIがどーとかを読み取れるムービーでした。
基調講演
- Java8出たよー。
- CDC/CLDCは廃止したわー。
- JDK8の日本語ドキュメント出たよー。
- JavaでGPU使うProject Smatra注目してねー。
- IoTとか、NECのPaPeRo petitとか、なんかアームがポーン動かしてるすごいチェスのデモとか
Java SE8概要
- アノテーションがいろんなところでたくさん付けられるようになったよ。
- もっと型推論できるようになったよ。
- リフレクションでメソッドのパラメータ名にちゃんとアクセスできるようになったよ。 http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Parameter.html#getName--
- APT(Annotation Processing Tool)消したわ。
- Javadocについて、コマンドラインと同じ機能をjavax.toolsに追加したわ。あとDocLintツールも追加したわ。
- 並列処理について
- DoubleAccumlatorとか書き込み多し読み込み少なし効率がいいやつ追加したわ。
- ForkJoinPoolもよくしたわ。
- Fork-Join Framework使ったArrays#parallelSortも新規追加したわ。
- Stream API追加したわ。遅延評価(遅延リスト)提供するわ。
- java.util.function追加したわ。Predicate
, Consumer , Function<T,R>, Supplier - Date and Time API追加したわ。区間とかつかえるよ。
- JDBC4.2はじめました。Date and Time APIの型も使えるよ。
- Base64コーデック、もうsunのパッケージの使わないでええで。
- Unicode 6.2までサポート。(Java SE7は6.0まで。)
- JEP124 https://blogs.oracle.com/mullan/entry/jep_124_enhance_the_certificate
- これからはHTTPの仕様にそってパーミッション切れるようになった。
- JavaFXアプリがライフサイクルメソッドで直接起動できるようになったよ。
- Compact Profileが追加されたよ。1(10.4MB) < 2(16MB) < 3(30MB) < FullJRE(54MB)。
- RhinoにかわるJavaScriptエンジンのNashorn、よろしくねー。ECMA Script5.1サポートだよ。jjsっていうコマンドラインツールでJavaScript実行可能だよ。
- 滅多に使わないGCの組み合わせを消したよ。
- パーマネント(PermGen)領域消したよ。今まで格納していたインターン文字列、クラスメタデータ、static変数はヒープとネイティブメモリ(メタスペース)に入ります。HotSpot VMとJRockitの統合によるものです。
Java SE8におけるHotSpotの進化
白人の方が出てきて、そのまま日本語しゃべりだしてびっくりした。
Buck David氏という元JRockitのエンジニアの方だそうです。 https://blogs.oracle.com/buck/
正直僕の脳にはむずかった。
まずはメモリ関係。
- PermGenやめました
- 正直PermGenのメリットがよーわからんかった
- パーマネント領域どれぐらい取ればいいか試行錯誤
- デフォルト小さい
- GC中パーマネント領域もマークするオブジェクトを見るので、パフォーマンスに影響する。
- 正直PermGenのメリットがよーわからんかった
- メタスペース作ったよ
- Javaのヒープからメタスペース中のクラスのメタデータにポインタを持つよ
- ClassLoaderごとに自分のメタスペースを持ち、メタスペースは複数のメタチャンクを持ち、VirtualSpaceが複数のメタチャンクを含むよ (メタスペースもVirtualSpaceもリストかな)
- メタスペースがHWM(High water mark - -XX:Min(Max)MetaspaceFreeRatio)を超えるとFull GC起こるよ。
- Full GCおこらないとMetaspaceのコレクションが行われないよ
- クラスローダが消えないかぎりそいつが持ってるメタスペースは確保され続けるよ。
- Compressed Oops(圧縮参照)っていう64bitアドレスを32bitにして持つ仕組みがあるよ。
- ヒープからメタスペースへのポインタも圧縮されるよ。
- Compressed Class Pointer Space(CCPS)っていう領域を作ってヒープからのメタスペースへの圧縮参照の中継地点を作ったよ。
- メモリオプション追加になったよ
- -XX:MaxMetaspaceSize (default:unlimited) あんまり使うのは非推奨。
- -XX:MetaspaceSize (default:21MB) 初期メタスペースサイズ。拡張のオーバヘッドや起動時Full GCを防ぎたい人向け。
- -XX:MinMetaspaceFreeRatio / -XX:MaxMetaspaceRatio デフォルト 40/70。メタスペースのHWM制御用。
- -MM:+UseCompressedClassPointers 64bitのポインタを32bitに縮めるやつ。64bit環境ではデフォルトで有効。
- -XX:CompressedClassSpaceSize (default:1GB) CCPSの大きさ。この分取るんじゃなくて、必要に応じてコミットしていく。
- MemoryManagerMXBean: MetaspaceManager のCompressedClassSpaceの数値はメタスペースの領域込みの表示だから注意な。
- jmap -permstatはjmap -clstatsに
- jstat -gc はメタスペースみます
- jcmd PID GC.class_statsでメタデータだしたけりゃJVMを -XX:+UnlockDiagnosticVMOptions付けて起動しな http://www.slideshare.net/TakahiroYamada3/tools-for-metaspace
Tiered Compilation(実行時のクラスコンパイル最適化の一種)について
- JDK8ではデフォルトで有効。6u25(7のバックポート実装だが)から使える。
- そもそも今までは、下記の2つを使い分けてたが
- Tiered Compilationは上の2つのいいとこどりで、C1から随時C2の状態に移行していくイメージ。
- それぞれC1/C2のコンパイルキューをもっているらしい。
- コンパイル状況はレベルで分けられている。 0.インタプリタ 1.C1コンパイル済み 2.C1限定コンパイル 3.フルC1コンパイル済み 4.C2コンパイル済み http://my.safaribooksonline.com/book/programming/java/9781449363512/4dot-working-with-the-jit-compiler/tieredcompilationdetails_html (メモり忘れたのでJava Performance The Definitive Guideより)
- これのレベル遷移が理想的だといい。-XX:+PrintCompilation, -XX:+PrintTieredEvents(超細かい)で見られる。
フォールスシェアリングの回避(JEP142)。Fork Join で競合するフィールドが同じキャシュラインに入るようにオブジェクトのレイアウトを頑張るとかなんとか
Indy(Invoke Dynamic)の高速化とNashornで従来のx2 - x4ぐらい性能出るよ。
あとJVMレベルで直接クラスライブラリのAPI実装を提供しいたり、CPUのAES専用命令を使ったり、JEP 171/164とか、JDK9でまた使わないGCの組み合わせ消しまーすとか。JDK8で何もしなくても50%パフォーマンス向上したよー!とか。
総じて濃かった。
Javaアプリケーション開発におけるテストとTDDの実践
- 自動テストは早めに行うと繰り返しが多くなるから収穫が大きい
- 自動テストはモック派とリアルDB使う派に分かれるね
- リアルDB使う場合は後処理じゃなくて、テストの初期化でDBの初期化とかやったほうが楽だしコケても原因がわかりやすいよ。
- DbUnit用のアノテーションとか作ったよ。
- テストしづれえシステム時間とかそういうのは無視ってもいいんじゃない。こだわっても実利ない。
総合テスト
http://d.hatena.ne.jp/nekop/20140523/1400810907
- Arquillianスゲー http://arquillian.org/
- 本当の実行環境にデプロイしてテストしてくれる
- デプロイもSeleniumもアノテーションで一発だね
- クライアントサイドとサーバサイドも同じメソッド内で扱えるよ
- QUnit (JavaScriptのJUnitみたいな)も扱える
- https://github.com/arquillian/arquillian-recorder ビデオもスクショもとれるしSIerでは使いたい人多いのでは
- 別にモックにこだわる必要ないよね
t_wada
- ニコニコ動画でTDD開発講座やってた http://www.nicovideo.jp/mylist/4805036
- TDDやる時は黄金の回転(課題ピックアップ→書いて失敗→動くけど汚い→動いて綺麗→課題ピックアップ…)を意識するのが大事。
- VisualStudioチームとかの話。
- TDDって形にこだわらない。下記は大事だけど。 http://agileinaflash.blogspot.de/2009/02/first.html
- Repeatable
- Independent
- テストはずっと残る概念。
英語と違い、日本語でまくしたてられると予備校の授業聞いてるみたいでした。
Lambda式とストリームAPI、並列処理の詳細
- JDK8でλはじまるしStream APIはじまるわ。
- @FunctionalInterface/Predicate/Function/Consumer/Supplier/#skip(n)/#limit(n)/#sorted()/#distinct()/Stream#stream()/Arrays#asStream()/IntStream/reader.lines()/.collect(Collectors.toList() / joining("")/toSet/averaging/toMap/partitioningBy/groupingBy)/peek()/findFirst : Optional/parallel()/reduce() (reduction)
- Stream: a multiplicity of values
- ストリームAPIでは不変値を扱うのがコツ。これで並列もへっちゃら。
正直眠かった。すまんかった。
総括
去年につづき、Java8の話題が中心でした。今のスケジュールだとJava7が来年3月にアップデート提供終了になっちゃうので、これからの開発はJava8を使う人も多いのではないでしょうか。
英語について、だいたいスピーカーの英語はそれなりの人なら割と聞き取れると思いました。でも恥ずかしがらずにイヤホンつけちゃっていいと思います。
会場について。電源とかは、期待してません。あの来場者では十分に供給するのは無理だろうし、個々人で対策するほうが理にかなっている気がします。回線は、自分のWiMAXすらつながらないこともありました。人多すぎ?
廊下が狭かったです。会場移動が間に合わず、おしっこかなり我慢しました。
グッズコーナーが今年もあり、ソーラー電灯買ったんですが、充電してもうまくつかない(´・ω・`)。書籍コーナーはO’Reillyがお買い得でした。英語書籍\1,500!
また来年も縁(?)があればいきたいと思います。