Heap statsfx analyzer
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
126
On Slideshare
112
From Embeds
14
Number of Embeds
1

Actions

Shares
Downloads
2
Comments
0
Likes
1

Embeds 14

https://twitter.com 14

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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