JavaOne2015サンフランシスコ-3日目

3日目。
※11/16公開
今日はJava SE系が主です。Java SE系は、Hiltonが会場です。

Moving to G1 GC [CON5823]

G1GCの話。
英語でGCの話を聞くのは、人類には早すぎた。


いろいろG1GCの動作を解説してくれたり


いろいろログ系のスイッチを教えてくれたり


してたのですけど、Javaパフォーマンス本を読み直そうとずっと思ってました。

Javaパフォーマンス

Javaパフォーマンス


とりあえずjClarity便利そう。

ランチと展示

今日のランチはHiltonのを取りにいきます。Hiltonでは展示も行われています。
展示で写真とってると、JRebelで有名なZEROTURNAROUNDの人たちが手をふってくれました。


ランチは展示の奥に積んであります。


で、Hiltonすぐ横のTaylor Streetをふさいで設営されているDuke's Cafeで食べます。


今日のはこんなので、全部食べるのにはちょっとしたガマンが必要でした。あと、風が吹いて寒い。

JDK 9 Language and Tooling Features [CON11284]

JDK9の話です。


jshell。コマンドラインJavaが試せるやつ。


JavaDocHTML5対応。


言語の微妙な変更


try-with-resourceでfinalか実質的finalならtryの前に初期化できる。

final Resource r = new Resource();
try(r){
  ...
}

これ、catch句とかでリソースを使いたいときに便利になります。


匿名クラスでもダイヤモンド推論ができるようになる。

Map<String, String> m = new HashMap<>{
  {
    put("a", "apple");
    put("b", "banana");
  }
}


地味すね。
ただ、不可解に変なコードを書く必要がなくなってよいです。


型推論が効率よく。

C<String> cs = new C<>(
                   new C<>(
                       new C<>(
                           new C<>(
                               new C<>()))));

とかやってると、指数オーダーだったのが


ゆるやかに。


ということで、全体に地味な調整って感じですね。
資料はこちら
https://blogs.oracle.com/darcy/resource/JavaOne/J1_2015-jdk9-langtools.pdf

Effective Java Streams [CON7066]

Streamの使い方。実はこれは唯一概要にValhallaという言葉があったセッション。
で、まずパターン。


3つのStreamを結合するとします。

Stream<String> a = String.of("a");
Stream<String> b = String.of("b");
Stream<String> c = String.of("c");


Streamを結合しようとすると、concatというメソッドがありますが、ふたつのStreamしか結合できません。

Stream.concat(a, Stream.concat(b, c))


ということで、flatMapを使います。

Stream.of(a, b, c).flatMap(s -> s)

なるほど。


あと、OptinalのStreamから値があるものだけを抜き出すとき。

Stream<String> optionals = Stream.of(
    Optional.of("a"), Optional.empty(), Optional.of("b"))


こんな感じになります。

optionals
  .filter(o -> o.isPresent())
  .map(o -> o.get())


これが、こう書けるようになります。

optionals.flatMap(Optinal::stream)

って、いつの間にかJava9の話になっている。


あと、NetworkInterfaceとか、Enumerationを返してたところにStreamを返すものを追加。


Stream.takeWhile/dropWhile便利そう!

あと、Files.linesの並列時に速くなったとか。
collect(toList())の並列性をよくするとか


そして、どういう文脈だったか忘れたけど、IntStream <: Streamだったらいいねって話。ここが今回のJavaOneのハイライトだった。


ここで試せる
http://hg.openjdk.java.net/valhalla

パッケージはjava.anyutil.streamだそうな。


なんでzipメソッドがないか。

zip(Stream, Stream)だけじゃなく、zip(Stream, IntStream)とかzip(IntStream, Stream)とかいろいろ用意する必要があってちょっと大変。
Valhalla待ち。
ライブラリも言語仕様も全部Valhalla待ちになってて、これ遅れるとヤバそう。

Ask the Architects [CON6826]

Javaのえらい人たちがいろいろ話すセッション。


唯一の資料


と、唯一のアニメーション(と言っていた)


資料もなく英語で自由に話す人たちについていくのは、人類には早すぎた。
Valhallaとかの話はなかった気がする。

The sun.misc.Unsafe Situation [CON7076]

Unsafeの話。


Unsafeは名前のとおり、あんまり安全じゃないけど内部でよく使われているAPIで、これを置き換えようという動きがあります。


内部では、reflectionやserialization、その他いろいろ使われています。


そして、外部でも、HadoopやSparkのようなデータ処理プラットフォームから、ScalaJRubyなど言語処理系まで、幅広く使われてます。


で、まあチェーンソーをジャグリングしてるような危なさがあると。


実際のメソッド

利用例 Unsafe
並列化プリミティブ Unsafe.compareAndSwap*
リアライゼーション Unsafe.allocateInstance
メモリ管理、レイアウト Unsafe.allocate/freeMemory
JVM外とのやりとり Unsafe.get*/put*


それに対応する機能。ここでPanamaデスヨ!

利用例 機能
並列化プリミティブ JEP 193 Variable Handles
リアライゼーション JEP 187 Serialization
メモリ管理、レイアウト Project Panama, Project Valhalla, Arrays 2.0
JVM外とのやりとり Project Panama, JEP 191 FFI


で、ここでマーク・ラインホルド氏がなにやら。

何の話だったか覚えてない・・・


Java9では

利用例 機能
並列化プリミティブ JEP 193 Variable Handles
リアライゼーション  
メモリ管理、レイアウト 配列の境界チェックやアクセスの改善
JVM外とのやりとり  


Closer to the metal、ハードウェアに近づこう、というのがPanamaのテーマですね。


まとめ

  • UnsafeはJava 9で凍結されるけど利用可
  • Java9でちょっとした対応
  • Project ValhallaやPanamaでのサポートに超期待


資料はこちらで公開されてます。
http://cr.openjdk.java.net/~psandoz/conferences/2015-JavaOne/j1-2015-unsafe-CON7076.pdf

Duke's Cafe

夕方、Taylor StreetのDuke's Cafeでは、ビールが出てました。


あと、バンド演奏。よくわからないけど、たぶんJavaエンジニアで構成されているバンドだと思います。

カニ(その1)

で、今日は学生時代のバイト先の方々がサンフランシスコに来てるということだったので、いっしょにメシ。


そう、カニです。


15年ぶりとかそんくらいに会った人たちと、カニでした。JavaOneメンバーじゃない人たちとカニというのも、なんか新鮮でした。