水曜日ともなると、だんだん疲れてきて、朝起きる気力もなくなってきます。明日は絶対に朝起きられないし.... というのも、今日は Tresure Island で Oracle Appreciation Event があったからです。
Appreciation Event では Kings of Leon と Pearl Jam のライブがあって、ホテルに帰って来たのは夜中の 2 時だったのでした ^ ^;;
今日、聴講したセッションは以下の通り。今日は Appreciation Event があるため、BOF はなしで、Technical Session のみです。
- Technical Session
- CON6583 G1 Garbage Collector Performance Tuning
- CON3992 Software Modularity: Paradoxes, Principles, and Architectures
- CON6784 JavaFX Graphics Tips and Tricks
- CON6837 Rendering in JavaFX with the New Canvas Feature
- CON4726 Writing Your Own JavaFX UI Controls
- CON5056 Diagnosing Your Application on the JVM
- おまけ
今日は Software Modularity Paradoxes, Principles, and Architectures が外れ。Jigsaw や OSGi の話もするのかと思っていたら、まったく関係ない話。Jigsaw の言及がないなと気づいた時点で、興味がなくなってしまいました。
そうなると、おそってくるのは眠気。まばたきをしたら、なぜか 30 分も経ってました >< ということで、ぜんぜん内容が分かってません。
Andrzej Olszak | Jaroslav Tulach |
Technical Session
CON6583 G1 Garbage Collector Performance Tuning - Charlie Hunt and Monica Beckwith
昨日の Advanced JVM Tuning の続きのセッション。
Charlie Hunt が黒い T シャツ着ているなぁと思ったら、Dreamforce の T シャツでした(右の写真)。と思ったら、Charlie が Oracle を辞めて、Salesforce に転職していた!!
Oracle の人が喋るセッションは必ず資料の一番始めに Safe Harbor があるのですが、Charlie が Oracle 辞めたから何でも話せるよと冗談。それって、冗談になってないですよ。
前半は G1GC の概略で、後半が G1GC の評価についてです。
G1GC は Java SE 7u6 でかなりパフォーマンスが向上しているようです。特にフル GC に時間がかかりすぎている、もしくは高頻度でフル GC が発生する場合や、より小さいヒープで運用したい時に G1GC は効果的だとしています。
G1GC は CMS と異なり、動的に Eden, Survivor、Tenure の領域がアロケーションされます。そして、使われなくなった領域は開放されます。
CMS と同じように Young GC はコピー GC なのですが、Old GC もコピー GC が行なわれます。このため、マークが CMS とはかなり動作が異なります。
CMS と G1GC はアルゴリズムがかなり異なるので、起動オプションもぜんぜん違うものになります。さすがに -Xmx などは同じですが、-XX で指定するオプションはぜんぜん異なります。
後半は Charlie から Monica にバトンタッチ。G1GC の評価やチューニングのヒントについて。
まずは G1GC のログの読み方。G1GC のログは 7u4 から導入されたようです。起動オプションの -XX:+PrintGCDetails でログを見ることができます。
ログではパラレルに処理されている、それぞれの処理についても表示し、スレッドごとの平均や最大最小まで表示しています。
-XX:G1LogLevel という起動オプションもあり、fine、finer、finest を指定することができます。finest の場合は -XX:+PrintGCDetails とほぼ同じ内容のログを出力します。
これ以外にも、チューニングを行なうためのいくつかの起動オプションを示しています。
CON6784 JavaFX Graphics Tips and Tricks - Richard Bair
今回の JavaOne で櫻庭にとって、一番おもしろかったセッションです。
今まで JavaFX に関するセッションは、ほとんどが機能に関するものだったわけですが、このセッションは非機能要求であるパフォーマンスについて。
パフォーマンスの tips について紹介していくのですが、これをやらないと very sad になるよということらしいですww
まずはじめはベンチマーク。
GUIMark 2 を使って、JavaFX と Chrome や Safari などと比較しているのですが、それはもちろん JavaFX の方が速いでしょうに。ただ、Mac の Safari でベクターグラフィックだけは妙に速い値を出してました。
その後、JavaFX 2.2 と JavaFX 8 の比較。だいたい、2 倍のパフォーマンス向上になっています。
さて、JavaFX という GUI を作る時のルール 2 つ。
- Rule #1: Do Less Work
- Rule #2: Know Your Device
おもに話は Rule #1 の方でした。なるべく描画させる部分を減らすというのは GUI では鉄則ですね。JavaFX の場合は、まずノード数を減らすことが重要になります。
同じように大きい領域を塗りつぶすのは非常にコストの高い処理になります。重なっている下の部分は描画しないようにするとか、ダーティーリージョンだけを描画するようにするなどして、再描画の領域をなるべく減らすことが重要です。
JavaFX に特有なこととして、CSS もあります。CSS のセレクタの書き方によってパフォーマンスはかなり変化するらしいです。また、Node#setStyle メソッドで CSS を指定することもコストがかなり高いようなので、できるかぎり行なわないのが常道です。ただ、setStyle は便利なんですよね。
JavaFX のコレクションの書き方によってもパフォーマンスに違いが出ます。
JavaFX のコレクションは要素が追加されたり削除されると、ノティフィケーションが発生します。バインドやトリガーを行なうためにはノティフィケーションは必要なのですが、あまりにも追加・削除が頻繁に行なわれるとパフォーマンスは低下します。
たとえば、add メソッドで何度も要素を追加するのではなく、addAll メソッドでまとめて追加するなどの工夫が必要です。
Rule #2 の方は、使用している GPU などを認識することが重要です。デスクトップ PC では 100K のノードでも大丈夫ですが、組み込み用とでは 500 から 1,000 個ぐらいのノードに抑えておく必要があります。
より小さい組み込み機器では 100 から 200 ぐらいになります。
ターゲットとしている機器によってノード数を調整することが必要になるわけです。
最後に JavaFX 8 で導入予定の Pulse Logger について。起動オプションの -Djavafx.pulseLogger=true でログが出力されます。
CSS やレイアウトなどの処理時間などもログに出力されるので、パフォーマンスチューニングに役立てることができます。
CON6837 Rendering in JavaFX with the New Canvas Feature - Jim Graham and Joe Andresen
セッションに出るまで全然気がついていなかったのですが、なんと Jim Graham ですよ!!!
彼は Java の黎明期からクライアントチームにいて、AWT や Java 2D を実装していた人です。おなじくクライアントチームにいた Amy Fowler (今は JavaFX のチームにいます) の blog に当時の写真が出てましたけど、まだ辞めずにいたとは!!
ちなみに、真ん中にいる V ネックのセータにオレンジのシャツを来ている人がおととい Strategy Keynote で Java SE について喋った Georges Saab で、右端の女性が Amy Fowler です。
うーん、懐かしい。
さて、このセッションは JavaFX 2.2 で導入された Canvas についてです。最近こそ Canvas というと、HTML 5 の Canvas のようですが、AWT の頃から Canvas はありました。
JavaFX の Canvas も AWT の Canvas と非常に似た使い方をします。つまり、Java 2D で描画するのと基本的に同じです。
つまり Canvas から Graphics2D に相当する GraphicContext を取得して、fillRect や fillOval するわけです。ただし、線だけ描画する drawX 系のメソッドはありません。JavaFX では fill と stroke は一緒に扱うので、fillX で stroke も設定しておけば線も一緒に描画します。
ただし、Canvas は描画は Java 2D のように行ないますが、ビットマップ系のノードと考えることができます。
デモとして、Preloader を Canvas で描画するというものをおこないました。Scene Graphで描画すると多くのクラスが必要になりますが、Canvas で描画するのであれば必要最低限のクラス数で済みます。
なので、Preloader には適しているというわけです。
Joe Andresen | Jim Graham |
CON4726 Writing Your Own JavaFX UI Controls - Paru Somashekar and Jonathan Giles
先ほどのセッションの Jim よりは古くはないですけど、Paru Somashekar もずっと前からクライアントチームにいましたね。それに対して Jonathan Giles は JavaFX になってから加わったメンバー。
Jonathan とは JavaOne Tokyo 以来です。
さて、このセッションはコントロールの自作に関するセッション。JavaFX 1.x の頃は自作のノードを作るためには CustomNode クラスを派生させればよかったのですが、JavaFX 2.x になって CustomNode クラスがなくなっていたのです。
このセッションで紹介されたカスタムコントロールを作る方法は 3 種類。
- シンプルな方法 既存のコントロールをカスタム CSS で見た目を変化させる
- カスタムな機能を追加する場合 レイアウトコンテナを派生させてカスタム CSS を使用する
- ライブラリとして再配布する場合 Control を派生させて、必要に応じて新しい Skin を作成し、カスタム CSS を使用する
ということではじめはカスタム CSS について。とはいっても書き方は普通の CSS です。
デフォルトの CSS を新しく生成した CSS で上書きします。こうすることで、Java のコードを変化させないでも見た目を変化させることができます。
次に機能を追加する場合です。機能を追加するだけであれば、Control クラスのサブクラスを定義する必要はありません。コンテナを派生させて、そこに必要となる機能を実装します。
この場合、Skin を作成する必要はほとんどないです。
例として、隙間なく並べられたボタンのはじっこだけラウンドにしたボタンなどが紹介されました。
最後のライブラリとして再配布する場合が一番難しくなります。
この場合は Control を派生させ、Skin も必要に応じて作成します。また、振る舞いを変化させるには Behavior も作成します。
CSS も独自のものを定義します。ここではレンジを指定できるスライダや、5 つ星などを表示するレイティングコントロールが紹介されています。
最後にちょっとだけ JavaFX 8 の UI Controls で予定されている機能について。カスタム Control を扱うための API や BIDI などがサポートされる予定です。
Jonathan Giles | Paru Somashekar |
CON5056 Diagnosing Your Application on the JVM - Staffan Larsen
アプリケーションのダイアグノシスについてのセッションで、何か新しい手法とかツールとかを紹介するのかと思ったら、JDK に付属しているツールを活用しましょうというセッションでした。
まずは、JVM へのアクセス方法から。
リモートの場合は JMX か jstatd です。JMX を使っているのが jvisualvm や jconsole など。jstatd は jstat が使用しています。
ローカルの場合は JVM にアタッチすることができます。jcmd や jstack、jmap が JVM にアタッチしています。
今後のツールとしてあげられたのが、Flight Recorder です。その他に Mission Control や JMX 2.0 などが紹介されています。
おまけ
JavaOne のランチボックスはおいしくないというのが定説なのですが、なんと今年のランチボックスはおいしいという噂が!!
さっそく検証のために、ランチボックスを食べてみました。今日のランチボックスは Korean Beef Wrap、Peruvian Chicken Sandwich、そしてベジタリアン用に Curry Tofu Salad の 3 種類です。
ちなみに、アメリカで JavaOne のようなカンファレンスでは必ずベジタリアン用の食事が用意されています。
で、食べてみたのは Korean Beef Wrap。
去年に比べると確かにおいしいかも! でも、そんなにおいしいというわけではないですねww デザートについているチョコケーキは甘すぎなのは例年通り。もうちょっとなんとかならないのかなぁ。
今年はランチ用のテーブルだけがあって、イスは用意されていません。なので、みんな立食。スペースがないのは分かりますけど、これはちょっと....
話変わって、今年の JavaOne のリテイルショップの話。
例年、リテイルショップには Duke のぬいぐるみがあるんですが、今年はありません!! その代わり、クマのぬいぐるみが。そんなクマなんかどうでもいいから Duke を出せばいいのに。
ぬいぐるみではないのですが、Duke の人形がレジ裏においてあるという情報を寺田さんから入手。でも、もうほとんど残ってませんでした。残念。
いちおう Java の T シャツは着ているのですが... | マグカップはまだありました |
さらに話が変わって、Candy Bar。いつも Candy Bar の写真だけなので、そこで配っているお菓子の写真も撮ってみましたww
今日も混雑してます | |
0 件のコメント:
コメントを投稿