焼肉が食べたい

ただの日記です。技術的に学んだことも書こうと思っていますが、あくまで自分用メモです。

HeapStatsの使い方メモ

HeapStatsの使い方。ツールの使い方はすぐ忘れるのでメモ。

HeapStatsとは

HeapStatsのWikiページ抜粋

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のバージョンを確認する。

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

実行中のアプリケーションにエージェントをアタッチするf:id:chie8842:20170325134717p:plain

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 f:id:chie8842:20170325134726p:plain

    • Log Detail Data f:id:chie8842:20170325135147p:plain

  • SnapShot Data

    • Summary Data f:id:chie8842:20170325134729p:plain

    • Histogram f:id:chie8842:20170325134732p:plain

    • SnapShot Data
      f:id:chie8842:20170325134720p:plain:w260f:id:chie8842:20170325134714p:plain:w260

    • Reference Tree
      表示されなかった。理由は不明。

  • Thread Recorder f:id:chie8842:20170325134717p:plain

  • JVMLive
    リアルタイムでプロファイリング結果が見える機能っぽい。JVisualVMで見えるみたいなもの? 今回試していないので、後で試したら追記する。

アナライザの詳しい説明は以下のページにある。
HeapStats/Analyzer-version2 - IcedTea

使ってみての所感

インストールや設定は簡単にできて、取得できる情報量も多い。
(エージェントが一括でログを取得してくれてらくちん)
アナライザのGUIについて、Resource Dataなどメモリや凡例がなく、パッと見方がわからないところがあり、改善の余地があるように感じた。
カーソルを当てたら説明がでてくるような機能などあれば便利だと思った。
なぜだかReference Treeの内容が見えなかった。(前に使ったときは見えた。)なぜだろう。

参考にしたページ

JavaVM監視・解析ツール HeapStatsを使ってみた | キャスレーコンサルティング 技術ブログ HeapStats/jp - IcedTea https://github.com/HeapStats/heapstats