末永恭正@YaSuenag
はじめに 
 私はJavaFX(Javaも?)素人です 
 我流でやってきた内容をお話しします 
 マサカリ禁止 
×
自己紹介 
 末永恭正(すえながやすまさ)@YaSuenag 
 SIerでJavaやってるサンデープログラマー 
 OpenJDK Author(jdk9) 
 IcedTea Committer 
 HeapStats作ってます 
http://icedtea.classpath.org/wiki/HeapStats/jp
HeapStats 
 Javaの障害解析支援&監視ツール 
 とにかくエージェントの性能に腐心 
 より軽く・より速く 
Javaアプリケーション実行マシン 
Javaアプリケーション 
(Java製アプリケーションサーバも含む) 
JRE (JVM) JVM監視エージェント 
JVMにアタッチ 
Java関連情報 
• ヒープスナップショット 
• OSリソース 
• etc… 
アナライザ 
解析
置き去りにされたアナライザ… 
 Java SE 6ベース 
 Swing 
 コードが冗長 
 やっぱり今風にしておきたい 
 見た目重要
HeapStats 
× 
JavaFX
HeapStatsFXAnalyzer 
https://github.com/YaSuenag/HeapStatsFXAnalyzer
HeapStatsFXAnalyzer 
 HeapStats Analyzer ♥ JavaFX8 
 Java8のコード 
 Lambda、StreamAPIバリバリ使いたい 
 プラガブル 
 アナライザへの機能追加を誰でもできる 
 コミュニティドリブンな開発 
 GitHub 
 developブランチ見てください 
 将来的には本家(IcedTea)へマージ予定
なぜJavaFX8? 
 SwingNodeが使いたかったから
使っている主な(?)機能 
 FXML 
 Chart 
 PieChart 
 StackedAreaChart 
 AreaChart 
 LineChart 
 Task 
 ProgressIndicatorとbind 
 国際化(と言えるか?) 
 とりあえず日本語と英語
構成 
 HeapStats 1.0相当のアナライザを実装 
 プラグインで機能拡張 
HeapStatsFXAnalyzer 
コア機能 
スナップ 
ショット 
パーサー 
ログ 
パーサーGUI部品 
プラグイン 
プラグイン 
管理 
組み込みプラグイン 
スナップ 
ショット 
リソース 
ログ 
参照ツリー 
表示 
CSV出力 
JVM 
死活監視…
HeapStatsのプラグイン 
 FXMLを含むJAR形式 
 コントローラはHeapStatsFXAnalyzerに含まれ 
るPluginControllerを継承する必要あり 
 Java8/JavaFX8可 
 プラグインにはTabが1枚与えられる 
 FXMLの含まれるパッケージ名を設定して 
libにJARと関連ライブラリを入れておけば 
OK 
heapstats.properties: 
plugins=jp.co.ntt.oss.heapstats.plugin.builtin.log ;  
jp.co.ntt.oss.heapstats.plugin.builtin.snapshot ;  
jp.dip.ysfactory.heapstats.plugin.jvmlive
jp.co.ntt.oss.heapstats.WindowController#loadPlugin() 
プラグインが呼ばれるまで1 
PluginClassLoader 
設定 
 クラスローダの設定 
 PluginClassLoader 
FXMLLoader 
 HeapStatsFXAnalyzerのlibを向くクラスローダ 
 lib配下のJARをすべてロード 
 FXMLLoader#setDefaultClassLoader()にセット
jp.co.ntt.oss.heapstats.WindowController#addPlugin() 
プラグインが呼ばれるまで2 
プラグインリスト 
ロード 
 各プラグインのロード 
 heapstats.propertiesのpluginsに指定されたもの 
 FXMLLoaderインスタンスはResourceBundleを 
指定して作成 
 日本語or英語 
 普通にFXMLLoader#load() 
 staticなload()は使わない 
FXMLLoader
jp.co.ntt.oss.heapstats.WindowController#addPlugin() 
プラグインが呼ばれるまで3 
 コントローラインスタンスの取得 
 FXMLLoader#getController() 
 HeapStatsのPluginControllerにキャスト 
 プラグインの初期設定 
 オーナーWindow、ProcessIndicator関連 
 タブ選択イベントの設定 
 Tab#setOnSelectionChanged() 
 タブへの画面追加 
セットアップ画面タブ表示 
FXMLLoader 
取得 
コントローラ
jp.co.ntt.oss.heapstats.plugin.PluginController 
PluginController 
 FXMLコントローラのabstractクラス 
 プラグインは必ず継承する必要あり 
 最小限の機能とインターフェースを提供 
 Taskのbind 
 ProcessIndicator、画面のグレーアウト 
 イベントのキック 
 タブ選択 
 ウィンドウのリサイズ 
 プラグインのライセンス情報の提供 
 オーナーウィンドウのインスタンス取得
<RefTreePlugin> 
jp.co.ntt.oss.heapstats.plugin.reftree.RefTreeController#initialize() 
プラグイン間のデータ受け渡し 
 各プラグインのコントローラに 
直接アクセス 
 コントローラのインスタンスは 
親ウィンドウのコントローラから取得 
 ロード済みプラグインのリストを持っている 
他にいい案が思い浮かばなかった…
今あるプラグイン
参照ツリー表示には… 
RefTreePlugin 
https://github.com/YaSuenag/RefTreePlugin
RefTreePlugin 
 HeapStatsFXAnalyzerにオブジェクト参照 
ツリー表示機能を追加 
 SwingNodeで実装 
 要JGraphX 
 http://www.jgraph.com/jgraphdownload.html
HeapStatsでネットワーク上のJVMを 
すべてルックアップ&死活監視! 
JVMLive 
https://github.com/YaSuenag/JVMLive
JVMLive 
 JDP(Java Discovery Protocol)を使って 
ネットワーク上のJVMを自動ルックアップ 
 見つけたJVMで動いているメインクラスや稼働時間 
などを確認可能 
 JDPパケットの定期受信ができないJVMをハイライト 
表示 
 JVMのクラッシュ検知機能 
 OracleJDK限定 
 -XX:+TransmitErrorReportと-XX:ErrorReportServerが 
指定されていればJVMLiveでクラッシュを検知& 
hs_errログを自動回収
JavaFXで困ったこと
Jp/co/ntt/oss/heapstats/utils/infoDialog.fxml 
困ったことその1 
 ダイアログがない 
 自作しました 
 Accordionで詳細メッセージが見れるようにし 
ました 
8u40 
までの命
困ったことその2 
 複数Chartの合成に対応していない 
 JIRAに要望は上がっているみたいです 
 RT-12710: chart API -- multiple chart types on the 
same axis 
 https://javafx-jira.kenai.com/browse/RT-1271 
※要ログイン 
 StackPaneと透過を使って複数Chartを組み合わ 
せてた時期もあり 
 結局、複数枚のChartに分割で落ち着く
jp.co.ntt.oss.heapstats.plugin.builtin.log.LogController#onChartMouseMoved() 
困ったことその3 
 ChartのTooltipが重い 
 描画要素数に応じてとても重くなる 
 Tooltipもどきを自作 
 マウスポインタ周辺にPopupを表示 
 描画タイミングはonMouseMoved/onMouseExitedの 
組み合わせ 
 マウスのX座標のみに注目 
 Yの値はXがわかればChartのデータから取れる 
 XAxisのgetLayoutX/getStartMargin/getValueForDisplay
困ったことその4 
 animated=trueなAreaChartで多要素の描画 
をさせるとシンボルが表示されない 
 アニメーションやめた(PieChart以外) 
今のところ 
アニメーションによる 
悪影響なし
JavaFXで困ってること
困ってることその1 
 SwingNodeが絡むと一部JavaFX 
コントロールがブラックアウトする 
<RefTreePlugin> 
 ウィンドウをリサイズすると全部真っ黒に… 
 黒い部分の上をマウスでグルグルすると表示 
される 
JavaFXコントロール 
SwingNode
困ってることその2 
 ChartのSeriesを含むFXMLがSceneBuilderで 
ロードできない 
 UI作るのにかなり致命的 
 OpenJFXからビルドしたものだときちんと 
ロードできた 
ココ
困ってることその3 
 WindowsとLinuxでウィンドウサイズ関連 
プロパティの動きが違う 
 Windowクラスのwidth/heightにセットする 
ChangeListener 
 Fedora20だとwidth/heightプロパティの変化が 
ワンテンポ遅い 
黒い縦線(障害発生ポイント)をChangeListenerで描画 
Win7(期待通り) Fedora20(ズレる)
困ってることその4 
<RefTreePlugin> 
 SwingNodeのDrag and Dropイベントが 
おかしい 
 java.awt.dnd.InvalidDnDOperationException 
 セルをドラッグする際のJGraphX内部の処理で 
例外発生
お願い
お願いします! 
 まずはFork 
 次にPull Request 
 できればプラグイン作成 
 「いいね!」
ご意見もお願いいます!
あったらいいな… プラグイン 
 vmstat 
 sar 
 iostat 
 etc…
Heap statsfx analyzer

Heap statsfx analyzer