このセクションでは、フィルタ、エクスパートモード、およびマシンモードを使用することで JVM で何が発生しているかを調べる方法を示します。
「関数」ビューを選択して、<JVM-System> という名前のルーチンを見つけます。
<JVM と入力して Enter を押した場合、ツールバーの「検索」ツールを使用すると非常にすばやく見つけることができます。
この実験では、<JVM-System> は約 4 秒間の CPU 合計時間を使用しました。<JVM-System> 関数の「時間」は、ユーザーコードではなく JVM の作業を表しています。
<JVM-System> を右クリックして、「フィルタを追加: 選択した関数を含むスタックのみを含める」を選択します。
ナビゲーションパネルの下にある「フィルタ」パネルには、以前は「アクティブなフィルタはありません」と表示されており、現在は追加したフィルタの名前とともに 1 つのアクティブなフィルタと表示されています。<JVM-System> のみが残るように「関数」ビューがリフレッシュされます。
パフォーマンスアナライザのツールバーで、ビューモードセレクタを「ユーザーモード」から「エキスパートモード」に変更します。
「関数」ビューがリフレッシュされて、<JVM-System> 時間で表された多数の関数が表示されます。関数 <JVM-System> 自体は表示されなくなります。
「アクティブなフィルタ」パネルの「X」をクリックしてフィルタを削除します。
「関数」ビューがリフレッシュされ、ユーザー関数が再度表示されますが、<JVM-System> によって表された関数はまだ表示されているのに対して、<JVM-System> 関数は表示されなくなります。
<JVM-System> を展開するためにフィルタリングを実行する必要はありません。この手順には、ユーザーモードとエキスパートモードの違いをより簡単に示すためのフィルタリングが含まれています。
要約すると、ユーザーモードではすべてのユーザー関数が表示されますが、JVM で使用したすべての時間が <JVM-System> に集計されるのに対して、エキスパートモードではその <JVM-System> アグリゲーションが展開されます。
次に、マシンモードを調べることができます。
表示モードリストで「マシンモード」を選択します。
マシンモードでは、解釈されるどのユーザーメソッドも「関数」ビューで名前別には表示されません。解釈されるメソッドに使用された時間は、Java バイトコードを説明的に実行する JVM の一部を表す Interpreter エントリに集計されます。
ただし、マシンモードでは、「関数」ビューには HotSpot コンパイル済みのすべてのユーザーメソッドが表示されます。Routine.add_int() などのコンパイル済みメソッドを選択すると、「選択の詳細」ウィンドウには、メソッドの Java ソースファイルが「ソースファイル」として表示されますが、「オブジェクトファイル」と「ロードオブジェクト」には JAVA_COMPILED_METHODS が表示されます。
マシンモードのままで、「関数」ビューでコンパイル済みメソッドが選択された状態で「逆アセンブリ」ビューに切り替えます。
「逆アセンブリ」ビューには、HotSpot コンパイラによって生成されたマシンコードが表示されます。コードの上にある列ヘッダーで「ソースファイル」、「オブジェクトファイル」、および「ロードオブジェクト」の名前を確認できます。
その関数のほとんどの作業がコードでさらに実行されるため、ほとんどの表示可能な行で表示される「CPU 合計時間」はゼロです。
次のセクションに進みます。