Java 解析ツール比較ガイド

概要

ただただ実行可能なコードを書くだけでは十分ではありません。メモリの割り当て、特定のコーディング手法を使用することによってもたらされる結果、同時実行の影響、パフォーマンス向上の可能なエリアなど、内部的な事情を把握しておきたい場合があります。解析ツールを使用することにより、これらが実現できます。

Java 解析ツールでは、JVM レベルで Java バイトコードの構造と操作をモニタリングできます。これらのコード構造や操作には、オブジェクトの作成、(再帰呼び出しを含む) 反復実行、メソッドの実行、スレッドの実行、およびガベージ コレクションなどが挙げられます。

この記事では、代表的な Java 解析ツールである JProfilerYourKitJava VisualVM および Netbeans について説明します。

JProfiler

JProfiler は多くの開発者にとって抜群のチョイスです。JProfiler は、システム パフォーマンス、メモリ使用量、メモリ リークの可能性、およびスレッド解析などを表示する、直感的なユーザー インターフェイスを提供しています。

このような情報を活用することで、基盤となるシステムにおいて何を最適化、削除、変更すべきかが容易に見えてきます。

以下は JProfiler のインターフェイスです。

JProfiler のインターフェイス

多くの解析ツールと同様、JProfiler はローカル アプリケーションとリモート アプリケーションの両方で使用可能です。新たにツールをインストールすることなく、リモート マシンで動作する Java アプリケーションの解析が可能です。

JProfiler はまた、SQL および NoSQL データベース両方の高度な解析を提供します。JDBC、JPA/Hibernate、MongoDB、 Casandra、および HBase データベースの解析をサポートしています。

以下のスクリーンショットは、現行の接続一覧を含む JDBC プローブのインターフェイスを示しています。

JProfiler: データベース プローブのビュー

JProfiler では、データベースとのインタラクションのコール ツリーを確認し、リークの可能性のある接続を見極めることができます。

JProfiler の機能のひとつである Live Memory (メモリ解析) では、アプリケーションによる現行のメモリ使用量を確認できます。オブジェクト宣言とインスタンス、またはコール ツリー全体におけるメモリ使用量を表示できます。

アロケーション コール ツリーでは、ライブ オブジェクト、ガベージ コレクトされるオブジェクト、もしくはその両方の表示を選択できます。また、アロケーション ツリーに特定のクラス、パッケージ、またはすべてのクラスを選択して表示できます。

下の画面では、すべてのオブジェクトによるライブのメモリ使用量をインスタンス数とともに表示しています。

JProfiler: ライブ メモリ ビュー

JProfiler は、Eclipse、NetBeans、IntelliJ などの主要な IDE との統合が可能です。スナップショットからソース コードに移動することもできます!

YourKit

YourKit Java Profiler は多様なプラットフォームで動作し、サポートしている各オペレーティング システム (Windows、MacOS、Linux、Solaris、FreeBSD など) ごとに個別のインストレーションを提供します。

JProfiler 同様、YourKit はスレッド、ガベージ コレクション、メモリ使用量、およびメモリ リークなどを表示するコア機能や、ssh トンネルを介したローカルおよびリモート解析を提供しています。

Tomcat サーバー アプリケーションのメモリ解析の結果を見てみましょう。

YourKit: Tomcat サーバー アプリケーションのメモリ解析

YourKit はまた、スローされた例外の解析が必要な場合に便利です。どのようなタイプの例外がスローされたか、また各例外が発生した回数を容易に把握できます。

YourKit には、興味深い CPU 解析機能があり、スレッド内のメソッドやサブツリーなど、コードの特定の領域に絞った解析が可能です。”what-if” 機能による条件付きの解析を可能にするため、非常に強力です。

次の画像は、スレッド解析のインターフェイスを例として示しています。

YourKit: スレッド解析用インターフェイス

YourKit ではまた、SQL および NoSQL データベースの呼び出しも解析できます。 実行した実際のクエリのビューも提供します。

技術的な問題点ではありませんが、YourKit のライセンス モデルには伝播性がないため、マルチユーザーや分散チーム、またはシングル ライセンスの購入にも適しています。

Java VisualVM

Java VisualVM は、シンプルでありながら安定した Java アプリケーションの解析ツールです。このツールは、デフォルトで Java Development Kit (JDK) にバンドルされています。Java VisualVM の操作は、JConsolejstatjstackjinfojmap など JDK の提供する他のスタンドアロン ツールに依存しています。

以下では、Java VisualVM を使った進行中の解析セッションの簡素なインターフェイスを表示しています。

Java VisualVM: ローカルのTomcat サーバー アプリの解析

Java VisualVM の興味深い特長のひとつに、新機能をプラグインとして開発できるという点があります。開発したプラグインは、Java VisualVM に組み込まれたアップデート センターに追加できます。

Java VisualVM は、メモリ解析や CPU 解析だけでなく、ローカル解析ならびにリモート解析もサポートしています。リモート アプリに接続するには、資格情報 (ホスト名、IP およびパスワード) を提供する必要がありますが、ssh トンネルはサポートしていません。瞬時にアップデートされる (通常 2 秒毎) リアルタイム解析を有効にすることもできます。

以下では、Java VisualVM を使って解析した Java アプリケーションのメモリ ビューを表示しています。

Java VisualVM: ヒープ領域のヒストグラム

Java VisualVM のスナップショット機能では、解析セッション中にスナップショットを撮り、後に分析することが可能です。

NetBeans

NetBeans の解析ツールは、Oracle によるオープン ソースの統合開発環境、 NetBeans IDE にバンドルされています。

この解析ツールは Java VisualVM と多くの類似点を共有していますが、1 つのプログラムにすべて (IDE および解析ツール) をまとめたい場合には適した選択だといえます。

ここで紹介している NetBeans 以外の解析ツールは、IDE 統合をサポートするプラグインを提供しています。

次のスクリーンショットでは、NetBeans のインターフェイスを表示しています。

NetBeans: テレメトリのインターフェイス

Netbeans は、軽量開発およびその解析にも適しています。NetBeans は、単一のウィンドウで解析セッションの設定、制御、および結果を表示します。ガベージ コレクションの頻度を通知するユニークな機能を備えています。

その他の解析ツール

Java Mission ControlNew RelicPrefix (Stackify 社の製品) など、マーケット シェアは概して低いものの、ここでの特筆に値するツールも存在します。たとえば、Stackify 社の Prefix は、軽量で優れた解析ツールで、Java アプリケーションだけでなく、他の Web アプリケーションの解析にも適しています。

結論

この記事では、Java 解析ツールにスポットを当ててみました。各ツールについて、製品を選択する手がかりとなりうる機能に注目しました。

多くの Java 解析ツールが存在し、中には独自の特性を持った製品があります。どちらのツールを採用するかは、開発者の選択、必要とされる解析のレベル、および製品の提供する機能に左右されます。


エクセルソフトでは、本記事で取り上げられている Java アプリケーション解析ツール、JProfiler を取り扱っています。製品概要、価格、およびライセンス体系などの詳細は、こちらを参照してください。


記事参照:
2018年 2月 2日