Heap statsfx analyzer

  • View
    1.901

  • Download
    4

  • Category

    Software

Preview:

DESCRIPTION

JavaFX Night講演資料

Citation preview

末永恭正 @YaSuenag

はじめに

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

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

マサカリ禁止

×

自己紹介

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

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

OpenJDK Author(jdk9)

IcedTea Committer

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

HeapStats

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

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

より軽く・より速く

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

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

JVMにアタッチ

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

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

アナライザ

解析

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

Java SE 6ベース

Swing

コードが冗長

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

見た目重要

HeapStats×

JavaFX

HeapStatsFXAnalyzerhttps://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

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

クラスローダの設定

PluginClassLoader

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

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

FXMLLoader#setDefaultClassLoader()にセット

PluginClassLoader

設定

FXMLLoader

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

プラグインが呼ばれるまで 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()

タブへの画面追加

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

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

FXMLLoader

取得

コントローラ

PluginController

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

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

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

Taskのbind

ProcessIndicator、画面のグレーアウト

イベントのキック

タブ選択

ウィンドウのリサイズ

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

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

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

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

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

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

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

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

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

今あるプラグイン

参照ツリー表示には…

RefTreePluginhttps://github.com/YaSuenag/RefTreePlugin

RefTreePlugin

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

SwingNodeで実装

要JGraphX

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

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

JVMLivehttps://github.com/YaSuenag/JVMLive

JVMLive

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

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

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

JVMのクラッシュ検知機能

OracleJDK限定

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

JavaFXで困ったこと

困ったこと その1

ダイアログがない

自作しました

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

8u40までの命

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

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

困ったこと その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()

困ったこと その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プロパティの変化がワンテンポ遅い

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

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

困ってること その4

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

java.awt.dnd.InvalidDnDOperationException

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

<RefTreePlugin>

お願い

お願いします!

まずはFork

次にPull Request

できればプラグイン作成

「いいね!」

ご意見もお願いいます!

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

vmstat

sar

iostat

etc…