CRaSH (Common ReusAble SHell)は起動中のJavaプロセスに接続しその内部を調べることができるユーティリティだ。単なるJavaで書かれたシェル(BeanShellのような)ではなく、Java Management Extensions (JMX)と同じように、実行中のJVMアプリケーションをリモートから管理、監視できる。
JavaアプリケーションでJMXを使う場合、明示的に設定をする必要がある。JavaにはデフォルトでJConsoleのようなグラフィカルなツールが含まれており、最近では、実行中のJavaアプリケーションに接続して、メモリ使用やスレッドなどの統計情報やJVMのプロパティなどを収集できるVisualVMも付属している。
また、JMXを使うと開発者や管理者は実行中のアプリケーションの設定を変更できる。この機能はMBeanインターフェイスとして開発者が公開した機能に対してのみ提供される。しかし、Java 6からはAttach APIをプログラムで操作することで、実行中のJVMに直接接続できる監視アプリケーションを作成するできる。例えば、jtopはCPUの利用を監視する。ただし、このAttach APIはHotSpot VMにだけ適用できる。
CRaSHはこの機能のさらに推し進める。Attach APIを利用し、コマンドラインシェル(内部コマンド、コマンド履歴や自動補完を搭載した)を提供する。このシェルは実行中のJVMに接続し、そのJVMに対してGroovyスクリプトを実行できる。これによってそのJVMの内部を詳細に監視できる。
CRaSHがビルドインでサポートしているのは次の通り。
- VMのプロパティの調査と変更、ガベージコレクタの実行。
- JDBCリソースへのSQLアクセス
- telnet/SSHを使ったアクセス(JMXはJava RMIを使うが、ファイアウォールの問題がある)
- メモリ情報の調査
- JVMスレッドの管理
- 外部のGroovyスクリプトの読み込み
- JCR(例えばJackrabbit)へのアクセス
- ログ出力
CRaSHの中核の機能は動画で紹介されている。この動画ではJVMに対してGroovyのスクリプトを実行している。また、別の動画では、もっと現実的な使い方を紹介している。この動画では、CRaSHでアプリケーションサーバに接続し、JDBCコマンドを使ってデータソースにSQLを発行している。CRaSHは、実行中のJVMと開発者が監視用の"レシピ"として作成したGroovyスクリプトの間にある薄いレイヤなのだ。
CRaSHの想定される利用例は、
- 実行中のJVMアプリケーションを監視する(JMXと同じように管理に使う)
- 実行中のJVMアプリケーションのチューニングをする(開発者向けの使い方)
- 実行中のJVMアプリケーションのデバッグ/ロギング(特定の処理の後で)
- 既存のJVMアプリケーションにコマンドラインインターフェイスを追加する(上級者向けの使い方)
- 実行中のアプリケーションに"プラグイン"を簡単に追加する
- 実行中のJVMアプリケーションの一部分のモックとして使ったり、I/O処理に割り込みをする
- 異なるリソース/サービスをひとつの観点から編成する
- JavaとGroovyのコードをつなぐ
CRaSHは年初にバージョン1.0をリリースし、基本的な使い方を紹介したオンラインデモを提供している。より詳しい情報はドキュメント、Javadoc、Googleユーザグループを参照。ソースコードはGitHubにある。