標準JDKに含まれる便利なツール

読者の皆さんは、最近のJDK（Java SE）に、開発やデバッグに便利な新しいツールが含まれていることをご存じでしょうか？ 古くからのJava開発者は、古い時代のJDKのツールしか知らず、一方で新しいJava開発者はEclipse/NetBeansなどの統合開発環境に慣れてしまい、細かなコマンドツールを直に使う状況が減ってきているかもしれません。

そこで今回は、最近のJava SE 6含めて比較的新しいと思われるツールを以下の5種類に分けて紹介します。

「こんなツールがJDKに付いてるなんて知らなかった！」という新たな発見があれば幸いです。

図1 フォルダ「C:\Program Files\Java\jdk1.6.0_10\bin」にあるファイル（Java SE Development Kit（JDK）6 Update 10をWindows XPにインストールした場合）

中には正式なサポート外のものも含みますので、ご注意ください。また、残念ながら現在のところWindows環境では利用できないツールもあります。

プロファイリング用ツール

jvisualvm.exe

プラグインによる拡張が可能な統合プロファイラ



「VisualVM」は機能拡張可能なプロファイラです。起動アプリケーションの概要やヒープの様子、GC（ガベージ・コレクション）の実行状況などの細かなモニタリング機能、スレッドの状態表示、CPU／メモリのプロファイリングといったさまざまな機能を併せ持ちます。

VisualVMから強制的にGCを実行し、その際の振る舞いを知ることもできます。プロファイリング用途のみならず、実行時にどのような状況で動作しているのかを細かく知ることのできるツールです。

図2 VisualVMの使用例

また、基本となるプロファイリング機能も充実していて、どの部分がホットスポット（処理時間がかかるネックの部分）なのかを簡単に見つけ出せます。導入もしやすく平易に使えるツールです。

jconsole

システム情報やメモリ使用量を確認するためのコンソール



「Jconsole」は、Java VMの監視用ツールです。JMX（Java Management Extensions）に対応し、メモリ利用状況をグラフで表示します。ローカルJava VMとリモートJava VMの両方に対応しています。

図3 Jconsoleの使用例

新たに、スレッド間のデッドロックを検知するための専用ボタンが用意され、「オンデマンドアタッチ」機能により、起動中のJava VMの情報を見たいときに見られるようになりました。

トラブルシューティング・情報取得のためのツール

jinfo

構成情報を取得



「jinfo」は、「jps」（後述）によって取得されたプロセスIDの構成情報を知るためのツールです。また、コアダンプファイルを指定して、Javaシステムプロパティやバージョン情報、Java VM起動時のオプションなどを把握できます。リモートデバッグサーバを利用して構成情報を知ることもできます。

jhat

Javaヒープ解析ツール



「jhat」は、ヒープダンプファイルを指定して、ヒープを解析するためのツールです。hprofオプションや、次に紹介する「jmap」が出力するバイナリファイルを利用します。jhatはWebサーバとして動作し、解析結果をWebブラウザで確認できます。パフォーマンスチューニングの際には、プロファイリングは必須なので、標準のツールだけで詳細な情報を得られるのは便利です。

jmap

メモリマップ



「jmap」は、指定したJava VMのプロセスマップやヒープ情報、クラスローダの情報を取得できます。オプションによる細かな指定で、ヒープサマリーやヒストグラム、ヒープの統計データなどを取得できます。前述のjhatと組み合わせることで効果を発揮します。

jsadebugd

サービスアビリティエージェントデバッグデーモン



「jsadebugd」は、jps（後述）で取得されたプロセスIDを基に、デバッグサーバとして機能するツールです。RMI（Remote Method Invocation）経由でリモートクライアントからの監視情報の問い合わせに応答するデーモンとして機能します。

jstack

スタックトレース取得



「jstack」は、Java VMのスタック情報を取得できます。具体的には、クラス名やメソッド名、バイトコードインデックス、行番号が取得できます。またWindows であれば、実行中に［Ctrl］＋［Break］キーを押すと、スレッドダンプするのと同様の情報も取得できます。

監視ツール

jps

仮想マシンプロセスステータスツール（旧、jvmps）



「jps」は、Java VMのプロセスIDをリストアップするツールです。jpsを実行したユーザーが権限を持つプロセスIDのみが取得できます。後述する「jstatd」を起動したリモートマシンのプロセスIDを得ることもできます。

jstat

仮想マシンプロセスステータスツール（旧、jvmps）



「jstat」は、Java VMのGCなどの計測値を表示するためのツールです。ヒープメモリの状態、クラスローダの統計情報、Permanent領域の状態などを知ることができます。データの取得間隔を指定して、GCの効果を調べたり、メモリーリークの監視が可能です。

jstatd

仮想マシンjstatデーモン（旧、perfagent）



「jstatd」は、前述のjstatのリモート監視用のデーモンです。リモートサーバの監視ログを残しておきたいときに便利に使えます。

配備／補助ツール

pack200

Jarパックツール



「pack200」は、圧縮率の高いJarファイルを作ることのできるツールです。通常のjarコマンドはzip圧縮でファイル群を1つにまとめられますが、pack200はgzip圧縮ツールをベースとしたより高圧縮率を誇るJarファイル作成ツールです。jarやzip、gzipについて詳しく知りたい読者は、下記記事を参考にするといいでしょう。

さらに、Jarファイルを作成する際に、デバッグ情報を削除してよりファイルを小さく圧縮することもできます。ネットワークで転送されるJarファイルを少しでも小さくしたいときに有効な方法です。

unpack200

Jarアンパックツール



「unpack200」は、先ほどのpack200の逆を行い、高圧縮のJarファイルを展開するためのツールです。pack200で圧縮されたJarファイルを通常のJar圧縮ファイルに変換する場合にも利用できます。

extcheck

Jarの競合を検出するユーティリティ



「extcheck」は、現在使われている拡張機能群のJarファイルと、調べたいJarファイルとの競合を調査できます。競合の調査とは、新しいJarファイルを利用する前に、すでに同じJarファイルや、新しいバージョンのJarファイルが存在しないかどうかを調べることです。

すでにJava環境がインストールされている環境に追加で環境を整える場合や、Jarファイルが多数ある複雑な環境を把握する際に役立つツールです。

スクリプティングツール

jrunscript

スクリプト実行環境環境



「jrunscript」は、「jrunscript -e "print('hello world')"」という使い方で、JavaScriptのプログラムを直接実行したり、インタラクティブモードで逐一プログラムを実行できる環境です。標準環境で利用できるのはJavaScript（Rhino実装によるECMAScript）ですが、ほかにもJavaFXなどのスクリプト言語でも利用できます。

また、指定したスクリプトファイルを実行するといったバッチ的な利用方法も可能です。主にサーバサイドで活用することを想定していて、Javaとの連携や簡単なテストや設定ファイルの記述／操作などに便利に使用できます。

トラブルに備え、未知のツールを便利なツールに

本稿で紹介したツール群は、無料で使えるJavaの標準的なツールです。しかしながら、すべてを熟知し、駆使して開発・デバッグを行っている人は実際のところ少数かもしれません。旧来のツールも便利な新機能が増えたり、ほかのツールと連携し効率よく使えるように機能強化されたものもあります。

また、例えばJava VM用のデバッガ「DTrace」のエージェント「dvm」を使えば、Java自身の深いところまで詳細な動きを知ることが可能です。さまざまな情報を知ることができる一方、プロファイラ系のツールは、オーバーヘッドを生じることが多く、パフォーマンスチューニングの際には、その状況をしっかりと把握して利用しなければいけません。DTraceについては、下記記事を参考にしてください。

便利なツールのありがたみが分かるのは、トラブルが起こったときです。重要な局面において、ちょっとしたツールを知っているか知らないかで、トラブルから抜け出せる確率が大きく違ってくることでしょう。慣れた環境の中で、慣れたツールを正確に使いこなすのも重要ですが、日々新しくなっていくツールに親しむ時間を作り、さらなる達人への道を歩んでいくことをお勧めします。

次回は2009年1月初めごろに公開の予定です。内容は未定ですが、読者の皆さんの興味を引き、役立つ記事にする予定です。何か取り上げてほしい内容などリクエストがありましたら、編集部や＠ITの掲示板までお知らせください。次回もどうぞよろしく。

■ 本稿以外のJDKツール紹介記事

関連記事 Webアプリの問題点を「見える化」する7つ道具

現場から学ぶWebアプリ開発のトラブルハック（1） 現場でのトラブル発生時に原因がなかなか掴めず、あたふたした経験はありませんか？ そんなときには、このハック！

現場から学ぶWebアプリ開発のトラブルハック（1） 現場でのトラブル発生時に原因がなかなか掴めず、あたふたした経験はありませんか？ そんなときには、このハック！ プロファイラでメモリリークとパフォーマンス問題を解決

Java開発の問題解決を助ける（2） フリーで利用できるプロファイラ「NetBeans Profile」を使ってメモリリークとパフォーマンスの問題を解決する方法を紹介する

Java開発の問題解決を助ける（2） フリーで利用できるプロファイラ「NetBeans Profile」を使ってメモリリークとパフォーマンスの問題を解決する方法を紹介する Eclipse上でプロファイリングを実現する

連載：Eclipse徹底活用（6） コーディング作業とプロファイリングを繰り返しながらアプリケーションのチューニングができる。そんな便利なEclipseの活用法を紹介しよう

連載：Eclipse徹底活用（6） コーディング作業とプロファイリングを繰り返しながらアプリケーションのチューニングができる。そんな便利なEclipseの活用法を紹介しよう 高負荷なのに片方のサーバにだけ余裕が……なぜ？

Linuxトラブルシューティング探偵団 第1回 Linuxベースのシステムで起こるトラブルに、百戦錬磨の達人が立ち向かう！ 実例を元に障害対応のプロセスを紹介します

Linuxトラブルシューティング探偵団 第1回 Linuxベースのシステムで起こるトラブルに、百戦錬磨の達人が立ち向かう！ 実例を元に障害対応のプロセスを紹介します JMeterによるWebサーバ性能評価の勘所

連載：実用 Apache 2.0運用・管理術（2） サーバのボトルネックを見極めるには、適切な性能評価が必要。そこでツールを使った効果的な性能評価のポイントを紹介する