Javaパフォーマンス本を読んで #2

第3章 Javaパフォーマンスのツールボックス

パフォーマンス分析は可視化と表裏一体です。アプリケーションの内部や、その実行環境で起こっていることを知るのがパフォーマンス分析で、可視化にはツールが不可欠です。

オペレーティングシステム付属のツールと分析

プログラムの分析の手始めになるツールは、Javaとの直接の関係はまったくなく、OSに付属している、基本的な監視のツールを利用します。 パフォーマンステストを行う際には、OSからもCPUとメモリ、ディスクの使用率は最低限収集すべきです。ネットワークを利用するプログラムでは、ネットワークの使用率も必要です。

CPUの使用率

CPUの使用率の値はある一定の期間(1秒 or 5秒 or 30秒)の平均値を表しています。CPUの使用率とは、プログラムがどの程度効率的にCPUを使えているかということを表しているので、この値が大きければ大きいほど望ましい状態になります。

ディスクの使用率

ディスクの使用率を監視することには、2つの大きな意味があります。1つ目は、アプリケーション自体に関わるものです。2つ目は、システムがスワッピングを行なっているかどうかわかるという点です。

ネットワークの使用率

ネットワークを利用するアプリケーションでは、ネットワークのトラフィックも監視しなければなりません。UNIXシステムでの基本的なネットワーク監視ツールとしては、netstatがよく使われます。

Javaの監視ツール

JVM自体に関する情報を得るには、Java向けの監視ツールが必要です。以下のようなツールがJDKに付属しています。

  • jcmd 指定されたJavaのプロセスについて、クラスやスレッドそしてJVMの基本的な情報を出力します。
  • jconsole JVMのアクティビティをグラフィカルに表現します。スレッドやクラスの利用状況、ガベージコレクションの内容などがわかります。
  • jhat メモリのヒープダンプを分析しやすい形で出力します。事後的な分析に利用されます。
  • jmap ヒープダンプや、JVMでのメモリの使用に関する情報を出力します。
  • jinfo JVMのシステムプロパティを表示します。一部のシステムプロパティについては、あたいの変更も行えます。
  • jstack Javaのプロセスのスタックをダンプします。
  • jstat ガベージコレクションやクラスローディングのアクティビティに関する情報を出力します。
  • jvisualvm JVMの監視、実行中のアプリケーションに対するプロファイリング、JVMのヒープダンプの分析のためのGUIツールです。

JVMの基本的な情報

  • 実行時間 JVMが実行されている時間を取得します。 jcmd [PID] vm.uptime
  • システムプロパティSystem.getProperties() を通じて得られるのと同じ情報が出力されます。 jcmd [PID] vm.system_properties jinfo -sysprops [PID]
  • JVMのバージョン `jcmd [PID] VM.version
  • JVMコマンドライン引数 jcmd [PID] VM.command_line
  • JVMのチューニングフラグ アプリケーションの中で有効かされているチューニングフラグは以下のようにして取得します。 jcmd [PID] VM.flags [-all]

スレッドの情報

jconsoleやjvisualvmを使うと、アプリケーション内で実行されているスレッドの数をリアルタイムに表示できます。スレッドの実行がブロックされているかどうかを知りたい場合には、スレッドスタックを確認するとよいでしょう。これにはjstackを利用します。

jstack [PID]jcmd

[PID] Thread.print

クラスの情報

アプリケーションの中で利用されているクラスの数を調べるには、jconsoleやjstatを使います。jstatではクラスのコンパイルに関する情報を得ることもできます。

ガベージコレクションの動的な分析

jconsoleはヒープの使用率をグラフとしてリアルタイムに表示でき、jcmdはガベージコレクションを実行させることができます。

プロファイリングツール

パフォーマンスアナリストにとって、プロファイラは最も重要なツールの1つです。 プロファイラはソケットなどの通信手段を使って対象のアプリケーションに接続し、アプリケーションのふるまいに関する情報を取得します。したがって、プロファイリング対象のアプリケーションと同じくらいプロファイラ自身についてもチューニングを行わなければなりません。

Java Mission Control

商用版のJava 7(7u40以降)とJava 8には、Java Mission Controlと呼ばれる新しい監視と制御の仕組みが含まれています。利用には商用ライセンスが必要です。 Java Mission Controlのプログラム(jmc)を起動すると、マシン上でのJVMのプロセスがウインドウ内に表示されます。