HeapStatsの使い方メモ
HeapStatsの使い方。ツールの使い方はすぐ忘れるのでメモ。
HeapStatsとは
HeapStats とは、JavaVM のヒープやGC状況を監視する軽量なツールで、エラーの兆候を検知してSNMPを通してリアルタイムなアラートを発します。生成するログはかなり小さいもので、GUIツールで解析することができます。 HeapStatsは、次の二つのプログラムで構成されます: エージェント(agent) - JavaVMの情報を収集するJVMTIエージェントプログラムです。 アナライザ(analyzer) - 上記の情報を解析する Javaアプリケーションプログラムです。
エージェントを使ってみる
環境はUbuntu16.04.2。
Javaインストール
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
java -version # java version "1.8.0_121" # Java(TM) SE Runtime Environment (build 1.8.0_121-b13) # Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
プロファイリングを行うサンプルアプリの作成
ArrayListに要素を追加していき、ゆっくりとヒープサイズが大きくなるようにする
// OOMESample.java import java.util.ArrayList; import java.util.List; public class OOMESample { public static void main(String[] args) { List<String> list = new ArrayList<>(); long i = 0; while (true) { if (i++ % 2000 == 0) list.add("aaa"); } } }
作成したアプリケーションをコンパイルする
javac OOMESample.java ls # OOMESample.class OOMESample.java
OOMESample.classができていること。
HeapStatsのインストール
git clone https://github.com/HeapStats/heapstats.git sudo apt-get install ant maven binutils-dev libsnmp-dev ./configure make su - make install ldconfig exit
HeapStatsをアタッチしてサンプルアプリを実行してみる
java -Xmx512m -agentlib:heapstats OOMESample # heapstats INFO: HeapStats 2.0.trunk # heapstats INFO: Supported processor features: AVX # heapstats INFO: Agent Attach Enable = true # heapstats INFO: SnapShot FileName = heapstats_snapshot.dat # heapstats INFO: Heap Log FileName = heapstats_log.csv # heapstats INFO: Archive FileName = heapstats_analyze.zip # heapstats INFO: Console Log FileName = None (output to console)
エージェントがアタッチされると、heapstatsの標準出力が現れる。
アプリケーションが終了すると、以下のようにログが出力されている。
ls # heapstats_analyze170309235501.zip # heapstats_log.csv # heapstats_snapshot.dat
エージェントの設定ファイルを操作する
今回は、ソースコードからビルドを行っているので、設定ファイル(heapstats.conf)のテンプレートは/usr/local/etc/にある。
設定を変更する場合は、これをコピーして使用する。
cp /usr/local/etc/heapstats.conf ./ # heapstats.confの設定を行う java -Xmx512m -agentlib:heapstats=/path/to/heapstats.conf OOMESample
実行中のアプリケーションにエージェントをアタッチする
wget http://icedtea.classpath.org/people/yasuenag/heapstats_tools/raw-file/tip/AgentAttacher/AgentAttacher.java javac -cp $JAVA_HOME/lib/tools.jar AgentAttacher.java
アプリケーション動作中に、以下を実行する
java -Xmx512m OOMESample # アプリケーションを起動する java -cp $JAVA_HOME/lib/tools.jar:. AgentAttacher /usr/local/lib/libheapstats.so /path/to/heapstats.conf # アプリケーション実行中に別のプロンプトで実行する。 # Num Process-Info # 0 AgentAttacher /usr/local/lib/libheapstats.so # 1 OOMESample # Input attach target process-number:1 <- エージェントをアタッチしたいプロセスの番号を入力する # Attacher is successed.
アナライザを使ってみる
Analyzerを起動する
GUI画面上のエクスプローラで、/path/to/heapstats/analyzer/fx/target/heapstats-analyzer-2.0.trunkを開き、heapstats-analyzer.jarをダブルクリックすると、アナライザが起動する。
Log Data
Resource Data
Log Detail Data
SnapShot Data
Summary Data
Histogram
SnapShot Data
Reference Tree
表示されなかった。理由は不明。
Thread Recorder
JVMLive
リアルタイムでプロファイリング結果が見える機能っぽい。JVisualVMで見えるみたいなもの? 今回試していないので、後で試したら追記する。
アナライザの詳しい説明は以下のページにある。
HeapStats/Analyzer-version2 - IcedTea
使ってみての所感
インストールや設定は簡単にできて、取得できる情報量も多い。
(エージェントが一括でログを取得してくれてらくちん)
アナライザのGUIについて、Resource Dataなどメモリや凡例がなく、パッと見方がわからないところがあり、改善の余地があるように感じた。
カーソルを当てたら説明がでてくるような機能などあれば便利だと思った。
なぜだかReference Treeの内容が見えなかった。(前に使ったときは見えた。)なぜだろう。
参考にしたページ
JavaVM監視・解析ツール HeapStatsを使ってみた | キャスレーコンサルティング 技術ブログ HeapStats/jp - IcedTea https://github.com/HeapStats/heapstats