Arthasとは何でしょう?
Arthas(読み方:アーサス)はAlibabaがオープンソースとして公開したJava診断ツールです。
開発環境、試験環境、本番環境で、JVMの状態をモニターしたり、障害が発生した時に、JVMを落とさず簡単に診断ができる。jconsole jmap jstackなどJDKツールより強力で、使いやすくできている。
#どういう問題を解決できるのか?
・このクラスはどのJarからロードされているか確認したい!なぜ例外が発生したか?
・私がコミットしたコードが実行されてなかった気がするけど。。。コミットし忘れ?もしかしてブランチを間違った?
・オンラインでデバッグできないので、ログを仕込んで再配備するしかない?
・本番のあるユーザのデータ処理に問題あったが、本番ではデバッグできないし、ローカルでは再現しない!どうしよう?
・今JVMってどういう状況なの?
・リアルタイムでJVMの状況を把握したい!
・FlameGraphを描画してボトルネックを見つけたい!
など様々なシーンで活用できると思います。
#ライセンス
Apache-2.0
#環境
JDK 6以上
Linux/Mac/Windows
#インストールと実行
Linux環境:
java -jar arthas-boot.jar
実行中のJavaプロセスが存在する場合、起動できる。
特定のJavaプロセスを監視したい場合は
jpsで現在実行中プロセスを確認し、そのPIDをパラメータとして渡せばいい。
例:
jps
341 Bootstrap
java -jar arthas-boot.jar 341
以下のような画面が表示され、シェルのようにarthasの各種コマンドを実行することができます。
オフィシャルサイトでは以下のコマンドで現在のパスにインストールし、実行ファイルas.shも自動で生成するらしい。普段診断ツールとして使うならこちらがおすすめです。
curl -L https://alibaba.github.io/arthas/install.sh | sh
./as.sh
#Arthasコマンド
シェル環境でこんな画面が表示できちゃうと正直すこし感動しますね。
上は現在JVMインスタンス内のスレッド一覧、真ん中の左側はメモリ状況、その右側はGC情報、一番下はOS、JVMのバージョン情報など。Tomcatの場合は性能の概要が見えます。
##thread
現在のJVMプロセス内のスレッド一覧とそれぞれの状態を表示できます。
さらにスレッド番号指定するとスタックトレースが表示できていまどこのメソッドで止まっているか見えます。
##jad
現在実行中のクラスに対してデコンパイルができます。バグ対応のため、コードを修正したが、本当に修正版が動いているかどうか確認することができます。また、ミスって同じJarモジュールの異なるバージョンを両方ともクラスパスに入っちゃった場合、どれが実際ロードされているか確認できます。
##redefine
外部の.classフアイルを読み込み、現在実行中のJVM内のクラスを差し替えることができる。
制限:クラスのフィールドの新規、メソッドの新規はできない。変更は可能。
JVMを再起動せず、Tomcatの場合は、再起動、再ロードせず、クラスのロジックを変更することが来ます。おお~
redefine /tmp/Test.class
redefine -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
##sc
現在JVMにロードされたクラスの情報を表示。
##stack
スタックトトレースの確認
以下test.arthas.TestStack#doGetのスタックトレースを確認する場合
##trace
どのメソッドが遅いか。ボトルネック、性能調査で使えそうですね。
#その他
web console機能があってWebでarthasのコマンドを実行できるので、複数サーバを診断するときに使えそうですね。
他にもいろいろ使えそうなコマンドがたくさんありますので、詳しくは
こちらを参考してください。
https://github.com/alibaba/arthas