torutkのブログ

ソフトウェア・エンジニアのブログ

Java Day Tokyo 2014参加

本日は、日本オラクル主催のJava Day Tokyo 2014に参加しました。
午前中は基調講演で米国Oracleのキーパーソンが講演、午後は技術セッションです。

基調講演

今日のセッション数は22で、参加登録者は2000人強とのことです。
Java SE 8が今年の3月にリリースされたので、Java SEについてと組み込み系への取り組み(IoT)について重点が置かれていた印象です。2000年代半ばごろのEnterprise一色とはずいぶん雰囲気が変わってきています。

  • 基調講演からピックアップ
Java SE 8日本語ドキュメントの公開

http://docs.oracle.com/javase/jp/8/
まだ英語の部分ありますが順次日本語化していきますとのこと。

JavaのプラットフォームとしてMIPSプロセッサをサポートしていくことを発表

組み込み系機器でMIPSプロセッサが使われているので、IoT対応に力を入れていることがうかがえます。

Beyond Java 8でProject Sumatraに言及

AMDと共同でJavaVMの実行時にGPUを活用するProject Sumatraについて言及していました。昨年のJavaOne SFでもセッションがありましたが、Java SE 9には間に合うか難しそうかなといったところですが、割とプッシュしているようなので期待します。Stream APIのparallelがGPGPUで動く世界が来るかも。

デモ

Javaの基調講演では、デモが恒例になっているようで、レゴ・マインドストームで作ったDuke Segwayが動いた(というか立った)、JavaFXの3次元チェスとチェスロボット((昨年JavaOne SFで披露したものと同じ)、それからNECの開発したロボット(Papero)など。

コミュニティ

Oracle Technology Network(OTN)が発行するJava Magazineの購読者は18万人強、Twitterの@javaフォロワーが16万人強。
Java Magazineは隔月で発行されるオンラインマガジンです。なお、日本語版もあるのですが、なぜか言及されてなかったような。
http://www.oracle.co.jp/javamagazine/

A-1 Java SE 8

Java SE 8の新機能を一通り流して紹介するセッションでした。

  • 型推論の例で出た次のコード、nil()なんてあったのですね。
List<String> ls = List.nil();
  • Date and Time API
  • DoubleAccumulator、DoubleAdder

マルチスレッド下で、値の更新が多いときに威力を発揮

以前はsun.miscパッケージ

  • JDKの依存性チェックツール

C-2 HotSpot

PermGen廃止

クラスのメタデータが格納される領域で、バイトコード、internされた文字列、staticフィールドの値が置かれるところですが、不足するとOutOfMemoryErrorになってしまう厄介なものでした。
Java SE 8では、ネイティブメモリを使ってmetaspaceという領域を作ってそこに格納するようになりました。metaspaceは実行中に広げることができます。
ただし、intern文字列はヒープに移されました。

metaspaceはネイティブメモリを使って作りますが、その際直接OSからメモリアロケートするとページ単位(通常4KB?)にメモリが確保されます。metaspaceはクラスローダー単位で領域を取り、小さなクラスローダーが多数ある場合はメモリに無駄が生じます。そこで、バーチャルチャンクで割り当てることにしました。

High Water Mark(HWM)によるmetaspaceサイズの制御をしており、メタスペースサイズがHWMを超えるとFull GCを行います(Full GCによってクラスローダーがGCされるとその管理するmetaspaceが消せるため)。

64bit環境では、ポインタが64bitになると使用メモリが増えるので、metaspaceのうちよく使われる情報だけを管理するCompressed Class Spaceを設け、オブジェクトがmetaspaceのクラス情報を参照するポインタを圧縮しています。

ティアードコンパイル

JDK 8でデフォルトになったけれど、機能はJDK 6u25から導入されていました。ただ、JDK 8でずいぶん改善されているそうです。
ティアードコンパイルは、HotSpotのC1(-client)コンパイラ、C2(-server)コンパイラを、どちらか1つ選択するのではなく併用することで、起動を早く、かつ最適化を深くする技術です。

いままではC1コンパイル時は動作情報(プロファイル)はネイティブコンパイルするかどうかの判断にしか使っていなかったのですが、ティアードコンパイルではC1でもプロファイルコンパイルをして、さらにC2でプロファイルコンパイルをします。

その他

フォールスシェアリング回避
JSR 292 Invoke Dynamicの再実装(性能改善)
java.util.concurrent性能改善
AES暗号化のハードウェア機能活用
JEP 171 Fence Intrinsics
incremental CMSは廃止の方向で
JVMJDK 8でパフォーマンス改善進んでいるのでJVMだけ上げても効果あり

A-3 JavaFX

アプリケーションの配布は、アプレットやWeb Startもいいけどネイティブパッケージお勧め
JavaFX 8の新コントロール

  • DatePicker
  • TreeTableView

JavaFX 8の新テーマ(新ルック&フィール)

  • Modena

JavaFX Scene Builder 2

HTML5

  • WebViewを使ってHTMLコンテンツ表示

Raspberry Piでは、WebView、Mediaのサポートなし

A-4 Lambda

ラムダ式(Stream API)の説明がコード例で紹介。
一部だけ違う似た処理を、ラムダ式でいかに共通化するかという話題(だったかと思う)。
コード中心の説明だったので、後日スライドが公開されたら確認してみよう。

A-5 Ask the Experts

ラムダ式の実装についての質問応答で、Invoke Dynamicの話が長かった。
ラムダ式中の例外についても。
Java EEの話はだんだん質問の意図が不明になってきたのでぐだぐだ感。

JavaOneのセッションを狙ったと思いますが、うーん、

展示

Java Day TokyoスペシャルのマインドストームRaspberry Piが限定販売されました。
書籍は、翔泳社オライリーが割り引き販売。Java逆引きレシピは大量に平積みされていましたが、買ったばかりなので・・・(割引販売あるなら待てばよかった)。
VxWorks 6.9と展示があって(リアルタイムOSでは有名な製品)、Javaとの関係を聞いたら、Java SE embeddedを載せるとのことでした(デモは残念ながら動かないのでとのこと)。