40
末永 恭正 @YaSuenag

Heap statsfx analyzer

Embed Size (px)

DESCRIPTION

JavaFX Night講演資料

Citation preview

Page 1: Heap statsfx analyzer

末永恭正 @YaSuenag

Page 2: Heap statsfx analyzer

はじめに

私はJavaFX(Javaも?)素人です

我流でやってきた内容をお話しします

マサカリ禁止

×

Page 3: Heap statsfx analyzer

自己紹介

末永恭正(すえながやすまさ) @YaSuenag

SIerでJavaやってるサンデープログラマー

OpenJDK Author(jdk9)

IcedTea Committer

HeapStats作ってますhttp://icedtea.classpath.org/wiki/HeapStats/jp

Page 4: Heap statsfx analyzer

HeapStats

Javaの障害解析支援&監視ツール

とにかくエージェントの性能に腐心

より軽く・より速く

JRE (JVM) JVM監視エージェント

Javaアプリケーション(Java製アプリケーションサーバも含む)

JVMにアタッチ

Javaアプリケーション実行マシン

Java関連情報• ヒープスナップショット• OSリソース• etc…

アナライザ

解析

Page 5: Heap statsfx analyzer

置き去りにされたアナライザ…

Java SE 6ベース

Swing

コードが冗長

やっぱり今風にしておきたい

見た目重要

Page 6: Heap statsfx analyzer

HeapStats×

JavaFX

Page 7: Heap statsfx analyzer

HeapStatsFXAnalyzerhttps://github.com/YaSuenag/HeapStatsFXAnalyzer

Page 8: Heap statsfx analyzer
Page 9: Heap statsfx analyzer

HeapStatsFXAnalyzer

HeapStats Analyzer ♥ JavaFX8

Java8のコード

Lambda、StreamAPIバリバリ使いたい

プラガブル

アナライザへの機能追加を誰でもできる

コミュニティドリブンな開発

GitHub

developブランチ見てください

将来的には本家(IcedTea)へマージ予定

Page 10: Heap statsfx analyzer

なぜJavaFX8?

SwingNodeが使いたかったから

Page 11: Heap statsfx analyzer

使っている主な(?)機能

FXML

Chart PieChart

StackedAreaChart

AreaChart

LineChart

Task ProgressIndicatorとbind

国際化(と言えるか?) とりあえず日本語と英語

Page 12: Heap statsfx analyzer

構成

HeapStats 1.0相当のアナライザを実装

プラグインで機能拡張

HeapStatsFXAnalyzer

コア機能

スナップショットパーサー

ログパーサー

GUI部品プラグイン

管理

組み込みプラグイン

スナップショット

リソースログ

CSV出力

プラグイン

参照ツリー表示

JVM死活監視 …

Page 13: Heap statsfx analyzer

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

Page 14: Heap statsfx analyzer

プラグインが呼ばれるまで 1

クラスローダの設定

PluginClassLoader

HeapStatsFXAnalyzerのlibを向くクラスローダ

lib配下のJARをすべてロード

FXMLLoader#setDefaultClassLoader()にセット

PluginClassLoader

設定

FXMLLoader

jp.co.ntt.oss.heapstats.WindowController#loadPlugin()

Page 15: Heap statsfx analyzer

プラグインが呼ばれるまで 2

各プラグインのロード

heapstats.propertiesのpluginsに指定されたもの

FXMLLoaderインスタンスはResourceBundleを指定して作成

日本語or英語

普通にFXMLLoader#load()

staticなload()は使わない

プラグインリスト

ロード

FXMLLoader

jp.co.ntt.oss.heapstats.WindowController#addPlugin()

Page 16: Heap statsfx analyzer

プラグインが呼ばれるまで 3

コントローラインスタンスの取得 FXMLLoader#getController()

HeapStatsのPluginControllerにキャスト

プラグインの初期設定 オーナーWindow、ProcessIndicator関連

タブ選択イベントの設定 Tab#setOnSelectionChanged()

タブへの画面追加

セットアップ 画面タブ表示

jp.co.ntt.oss.heapstats.WindowController#addPlugin()

FXMLLoader

取得

コントローラ

Page 17: Heap statsfx analyzer

PluginController

FXMLコントローラのabstractクラス

プラグインは必ず継承する必要あり

最小限の機能とインターフェースを提供

Taskのbind

ProcessIndicator、画面のグレーアウト

イベントのキック

タブ選択

ウィンドウのリサイズ

プラグインのライセンス情報の提供

オーナーウィンドウのインスタンス取得

jp.co.ntt.oss.heapstats.plugin.PluginController

Page 18: Heap statsfx analyzer

プラグイン間のデータ受け渡し

各プラグインのコントローラに直接アクセス

コントローラのインスタンスは親ウィンドウのコントローラから取得

ロード済みプラグインのリストを持っている

他にいい案が思い浮かばなかった…

<RefTreePlugin>jp.co.ntt.oss.heapstats.plugin.reftree.RefTreeController#initialize()

Page 19: Heap statsfx analyzer

今あるプラグイン

Page 20: Heap statsfx analyzer

参照ツリー表示には…

RefTreePluginhttps://github.com/YaSuenag/RefTreePlugin

Page 21: Heap statsfx analyzer

RefTreePlugin

HeapStatsFXAnalyzerにオブジェクト参照ツリー表示機能を追加

SwingNodeで実装

要JGraphX

http://www.jgraph.com/jgraphdownload.html

Page 22: Heap statsfx analyzer
Page 23: Heap statsfx analyzer

HeapStatsでネットワーク上のJVMをすべてルックアップ&死活監視!

JVMLivehttps://github.com/YaSuenag/JVMLive

Page 24: Heap statsfx analyzer

JVMLive

JDP(Java Discovery Protocol)を使ってネットワーク上のJVMを自動ルックアップ

見つけたJVMで動いているメインクラスや稼働時間などを確認可能

JDPパケットの定期受信ができないJVMをハイライト表示

JVMのクラッシュ検知機能

OracleJDK限定

-XX:+TransmitErrorReportと-XX:ErrorReportServerが指定されていればJVMLiveでクラッシュを検知&hs_errログを自動回収

Page 25: Heap statsfx analyzer
Page 26: Heap statsfx analyzer

JavaFXで困ったこと

Page 27: Heap statsfx analyzer

困ったこと その1

ダイアログがない

自作しました

Accordionで詳細メッセージが見れるようにしました

8u40までの命

Jp/co/ntt/oss/heapstats/utils/infoDialog.fxml

Page 28: Heap statsfx analyzer

困ったこと その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に分割で落ち着く

Page 29: Heap statsfx analyzer

困ったこと その3

ChartのTooltipが重い

描画要素数に応じてとても重くなる

Tooltipもどきを自作

マウスポインタ周辺にPopupを表示

描画タイミングはonMouseMoved/onMouseExitedの組み合わせ

マウスのX座標のみに注目

Yの値はXがわかればChartのデータから取れる

XAxisのgetLayoutX/getStartMargin/getValueForDisplay

jp.co.ntt.oss.heapstats.plugin.builtin.log.LogController#onChartMouseMoved()

Page 30: Heap statsfx analyzer

困ったこと その4

animated=trueなAreaChartで多要素の描画をさせるとシンボルが表示されない

アニメーションやめた(PieChart以外)

今のところアニメーションによる

悪影響なし

Page 31: Heap statsfx analyzer

JavaFXで困ってること

Page 32: Heap statsfx analyzer

困ってること その1

SwingNodeが絡むと一部JavaFXコントロールがブラックアウトする

ウィンドウをリサイズすると全部真っ黒に…

黒い部分の上をマウスでグルグルすると表示される

<RefTreePlugin>

JavaFXコントロール

SwingNode

Page 33: Heap statsfx analyzer

困ってること その2

ChartのSeriesを含むFXMLがSceneBuilderでロードできない

UI作るのにかなり致命的

OpenJFXからビルドしたものだときちんとロードできた

ココ

Page 34: Heap statsfx analyzer

困ってること その3

WindowsとLinuxでウィンドウサイズ関連プロパティの動きが違う

Windowクラスのwidth/heightにセットするChangeListener

Fedora20だとwidth/heightプロパティの変化がワンテンポ遅い

Win7(期待通り) Fedora20(ズレる)

黒い縦線(障害発生ポイント)をChangeListenerで描画

Page 35: Heap statsfx analyzer

困ってること その4

SwingNodeのDrag and Dropイベントがおかしい

java.awt.dnd.InvalidDnDOperationException

セルをドラッグする際のJGraphX内部の処理で例外発生

<RefTreePlugin>

Page 36: Heap statsfx analyzer

お願い

Page 37: Heap statsfx analyzer

お願いします!

まずはFork

次にPull Request

できればプラグイン作成

「いいね!」

Page 38: Heap statsfx analyzer

ご意見もお願いいます!

Page 39: Heap statsfx analyzer

あったらいいな… プラグイン

vmstat

sar

iostat

etc…

Page 40: Heap statsfx analyzer