Java Day Tokyo 2014個人まとめ

今年も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は廃止したわー。
    • 8はCompact Profile 1/2/3/Full JREで頑張ってね。Full JREより前のプロファイルは画面無しの場合に最適だから。
    • Java9はもっとモジュール化すげえ頑張るから。
  • JDK8の日本語ドキュメント出たよー。
  • JavaGPU使うProject Smatra注目してねー。
  • IoTとか、NECPaPeRo 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)。
    • Jigsawへの第一歩だよ。いくつかのクラスローダへの前提とかプロプライエタリなSPIなコードをサービスローダ(java.util.ServiceLoader)のものにしたりJDKツールでコードの依存性を見たりとかしてる。
  • RhinoにかわるJavaScriptエンジンのNashorn、よろしくねー。ECMA Script5.1サポートだよ。jjsっていうコマンドラインツールJavaScript実行可能だよ。
  • 滅多に使わないGCの組み合わせを消したよ。
  • パーマネント(PermGen)領域消したよ。今まで格納していたインターン文字列、クラスメタデータ、static変数はヒープとネイティブメモリ(メタスペース)に入ります。HotSpot VMJRockitの統合によるものです。

Java SE8におけるHotSpotの進化

白人の方が出てきて、そのまま日本語しゃべりだしてびっくりした。

Buck David氏という元JRockitのエンジニアの方だそうです。 https://blogs.oracle.com/buck/

正直僕の脳にはむずかった。

まずはメモリ関係。

  • PermGenやめました
    • 正直PermGenのメリットがよーわからんかった
      • パーマネント領域どれぐらい取ればいいか試行錯誤
      • デフォルト小さい
      • GC中パーマネント領域もマークするオブジェクトを見るので、パフォーマンスに影響する。
  • メタスペース作ったよ
    • 今までの世代別GCの領域はそのまんま。クラスメタデータはメタスペースで管理。
    • インターン文字列はヒープ。非オブジェクトの一部がメタスペースに行ったよ。
    • 別にパーマネント領域の名前が変わっただけじゃないよ。
      • パーマネント領域はランタイム時にサイズを変更できなかったよね。
      • メタスペースはヒープとかと関係ないし、分散・拡張・縮小できる。
    • デフォルトはサイズ制限無しで増えるよ。
    • GCに見られないからGCに悪影響を及ぼさないよ。
    • アンロードはClassLoaderの単位で行うから断片化しづらいよ。(メモリ確保はOSのページ単位)
  • 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(実行時のクラスコンパイル最適化の一種)について

フォールスシェアリングの回避(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

t_wada

英語と違い、日本語でまくしたてられると予備校の授業聞いてるみたいでした。

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!

また来年も縁(?)があればいきたいと思います。