谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

俺様とJavaOne 2013(中編)

JavaOne 3日目、自分のセッション当日は
やっぱり直前まで資料準備&練習でバタバタしていました。
この性格、死ぬまで治らない予感!

Day 3 : 解析ツールのセッションは人気

3日目、僕のセッションは夜7時半からなので、
朝イチにあった面白そうなセッションに参加していました。

[CON5092] Diagnosing Your Application on the JVM

元BEAのStaffan Larsenのセッション。
朝イチにも関わらず、満席になる人気セッションでした。


内容は、診断・解析ツールについて、デモを交えて次々と紹介するセッションで
主に7u40から使えるようになった(7u4から使えてたものもあるけど)
「jcmd」(旧jrcmd)を中心に紹介されていました。


ちょっと列挙しますと・・・
jps : Javaプロセスの一覧を列挙する
jcmd : 引数なしならjpsと同じ
jcmd VM.uptime : Javaプロセスの起動後の経過時間
jcmd Thread.print : スレッドダンプ。jstackと同じ。
jcmd GC.heap_dump : ヒープダンプ。jmapと同じ。
jcmd -gcnew 1s : 毎秒のGC領域のサイズを見る
jcmd PerfCounter.print : JVM内部で保持している様々なカウンタを取得
などなど。


自分的に衝撃だった事と言えば、jcmdコマンドの引数で pid に 0 を指定すると
全てのJavaプロセスの情報をまとめて取れる、というところ。
実際に使う機会があるかどうかは分かりませんが、良い事を知った感がありますね(笑


またセッション後半は、このような解析ツールをリモートから実行するために、
jstatdやJMX Remoteを利用するという話や、その裏側の仕組みが説明されました。


正直、他の作業をしながら聞いていたので、かなり聞き逃してしまったのですが
リモートから診断・解析をする時に、何ができるか・できないかを判断するための
背景となる知識が得られる良い内容でした。まさにJavaOneらしい内容だったと言えます。


特に解析する機会が多いとか、開発ツールを作る立場であるとか、
そういう人は、このセッションの資料をきちんと読むべきだと思いますね、
っていうか、私も、きちんと読み直します!


ところで、セッションの後に

こんな風にスピーカーのStaffanさんに、お礼なのか挑発なのか分からないツイートをして
私のセッションに来て頂きました。我ながら、強引なことをしたもんです。


そんなわけで、夜には自分のセッションがあったわけですが
それについては、前後の話も含めて、またきちんと別エントリとして投稿します。

Day 4 - Lambda、Lambda、JFR

おはよう世界。
自分のセッションが終わった開放感からか、倒れ込むように寝てしまい
これは昼まで寝るかなと思ったら、意外と5時間睡眠ぐらいで目が覚めてしまい
時差ボケの威力を実感した早朝でした。


そんなわけで、朝から元気にセッションに参加します。
そう、僕のJavaOne参加はここから始まったわけです。

[CON2055] Programming with Lambda Expressions in Java

Agile Developer, Inc.の社長、Venkat Subramaniamによる
軽妙でウィットに溢れたLambdaのセッションでした。


内容的には、外部イテレーターから内部イテレーターの書き方の移り変わり、
Lambdaの文法やstreamの使い方や効果などを紹介するという
比較的、初級者向けのセッションなのですが、その語り口調が面白すぎて
本当に笑いの絶えないセッションでした。


直接的な表現よりも、間接的な表現を軽妙に語る事で面白さを増す感じでしたね、たとえば

  • 汚い → とても子供に見せられない。しっ見ちゃいけません!
  • 危険 → 何をやろうとしているんだ、家に帰って考え直せ!
  • 素敵 → これは食欲をそそる!

などなど。
って私はJavaOneに来て何を学んでるんですかね。


もう少し実用的なところをフィードバックすると、
やはりLambda時代にはAPIデザインが少し変わるということでしょうか。


たとえば自分で比較するユーティリティメソッドを書く際には、
isPriceLessThan(500, value) と書けるようなAPIを提供するのではなく、
isPriceLessThan(500).test(value) と書けるようなAPIを提供することで
Lambda式として利用できるようにしていました。


ちょっとこの辺り、自分でも消化しきれていないので
日本に帰ったら資料を見ながら復習しようと思います。


ってよく考えたら、このセッション、
テキストエディタだけで話してたから、資料ないんだった (^^;;

[CON7942] Java 8 Streams: Lambda in Top Gear

続けてのLambdaセッション。
Paul Sandozと、Lambdaの神Brian Goetzのセッションです。


streamのAPIは、集計処理などにおいて、
うまくparallel化ができるもの、できないものがあったり、
処理を途中で中断しても良いもの、全ての要素を走査するものがあるなど、
APIは、いくつかのカテゴリで「分類」することができます。


この分類次第で、parallel化した時のパフォーマンスなども変わってくるため
streamを使う際には、この分類をきちんと押さえておかなければいけない、
ということが説明されていました。ちょっと自分にはなかった視点でした。


この辺りは、資料をダウンロードして学び直す必要があるので、
ボロが出ないうちに、説明をこの辺で切り上げましょう (^^;

[CON5091] Java Flight Recorder Behind the Scenes

3日の朝イチに解析ツールの紹介していた、Staffan Larsenのセッション。
前半こそFlight Recorderの紹介だったのですが、
後半はFlight Recorderの設計の話が展開され、かなり興味深かったですね。
そんな後半の話だけピックアップして紹介します。


1. Thread buffers
Flight Recorderが取得した情報は、スレッドローカルのThread buffersに貯めてから、
共有のGlobal buffersに書き出します。
こうすることで、Global buffersへの書き込みが衝突することを抑えています。
この辺りは、Flight Recorderがメイン処理に影響を与えないようにするために
欠かせない、いわば当たり前の設計でしょう。


2. Flight Recorderは永久には情報を取り続けない。
メモリリークへの対策として、情報は一定期間かサイズごとに消すか上書きしています。
これも当たり前のことですが、私は過去にちょっとやらかした事があります (^^;


3. Flight Recorderは、アプリケーションのクラスやオブジェクトへの参照を持たない。
これも、メモリリークを防ぐうえで不可欠のポリシーです。


4. クラス名はIDに変換する。
クラス名(文字列)を、int程度の数値に変換することで、
ファイルやメモリの空間効率を向上させます。
また、そのクラス名と数値のマップをFlight Recorderの出力ファイルに
持たせておくことで、互換性や移植性にも配慮しています。
こういう細かいところも、きちんと工夫しているんですね。


5. クラス一覧自体も定期的にリセットする。
クラス一覧がメモリリークの原因にならないよう、
一定期間ごとにファイルに出力して、クラス一覧をクリアしてしまいます。
(このタイミングを「チェックポイント」と読んでいました)
最後にクラス一覧をマージするかどうかは、ちょっと分かりませんでした。
マージしないと重複が出てしまって、ファイル効率がよくない気がします。


6. スタックトレースのpoolを作る。
同じスタックトレースが何度も表れることが多いため、
スタックトレースのプールを作っておいて、(全く)同じスタックトレース
発生した場合には、前のスタックトレースへの参照を使うだけにします。
なるほど、勉強になります。


というような、ENdoSnipeの開発者的にありがたい情報がたくさんありました。
もちろんアプリケーション開発をするうえでも、このようなメモリやデータの
効率化の仕組みを「発想」することは、とても大切だと思います。
まだまだやるべき事があるのだなと、改めて思い知らされた感じです。

[CON2959] Modular JavaScript

Luminis Technologies社のSander Mak、Paul Bakkerのセッション。
なんかJavaとの連携もありそうな感じのアジェンダが提示されていたんですが
実際には、JavaScriptのライブラリやフレームワークを使ったときの
packageやclassの可視性なんかを、延々延々とJavaScriptのソースで説明するセッションで、
Javaコードは全く出てきませんでした。


ここJavaOneやぞ!

4日目終わり

この後の時間帯に、kotlinのセッションがあったり、
あの #てらだよしお さんのJavaEEのセッションがあったのですが、
どうしても眠かったため、ホテルに戻って休んでいました。


聞くところによると、kotlinのセッションは10人いなかったそうです。
kotlinの過疎感ハンパない!(><)


そして寺田さんのセッションは「質問はTwitterでお願い」と言っていたにも関わらず、
バンバン質問が出て、大変だったそうです(そして、きちんと回答したそうです!)
そりゃOracleのエンジニアがJavaEEについて話したら、質問出るって!


ちなみに4日目の夜には、トレジャーアイランドで
Maroon5というバンドのライブなどあったのですが、
上にも書いた通り、ホテルに戻ってお休みしていました。


Folder5が来るんだったら、無理してでも行ったと思うんですけどね。
#行かねーよ。


そんなわけで、JavaOneも後半戦に差し掛かってきました。