2025/03/24 18:23 JEP Draft: JFR Method Timing and Tracing

ロボ子、JDK Flight Recorder (JFR)が拡張されて、バイトコードベースのメソッドタイミングとトレースをサポートするようになるのじゃ!

それはすごいですね、博士!具体的にはどう変わるんですか?

サンプルベースではないメソッド呼び出し統計を収集できるようになるのが大きいぞ。特定のメソッドの実行時間やスタックトレースを、ソースコードを変更せずに収集できるのじゃ!

ソースコードを変更せずに、ですか?それは便利ですね!

じゃろ?コマンドライン引数とかjcmdコマンド、.jfc設定ファイル、Java Management Extensions (JMX)でメソッドを選択できるのもポイントじゃ。

柔軟性が高いですね。結果はどうやって確認するんですか?

記録ファイルに対しては'jfr view'コマンド、ライブJVMに対しては'jcmd JFR.view'コマンドを使うのじゃ。

なるほど。でも、何か対象外のこともあるんですか?

メソッドのパラメータとかインスタンス変数の収集は対象外じゃ。JFRが機密情報を抽出するための攻撃ベクトルになる可能性があるからじゃと。

セキュリティも考慮されているんですね。多数のクラスを同時にトレースするとパフォーマンスが落ちるから、メソッドサンプリングが推奨されるんですね。

そうそう。メソッド呼び出しのトレースとタイミングは、どのメソッドが呼び出されているか、実行にどれくらいの時間がかかっているか、メソッドが互いにどのように相互作用しているかを理解するのに役立つからの。

`jdk.MethodTrace`と`jdk.MethodTiming`という新しいイベントとして実装されるんですね。

`method-trace`オプションは、フィルタに一致するメソッドのスタックトレースを記録して、`method-timing`オプションは、フィルタに一致するメソッドの呼び出し回数と平均実行時間をカウントするのじゃ。

フィルタは、クラス、クラス-メソッド、メソッド、またはアノテーションにすることができるんですね。複数のフィルタは、セミコロンで区切って指定できる、と。

その通り!JMXとjdk.management.jfrモジュールのRemoteRecordingStreamクラスを使って、ネットワーク経由で構成することもできるぞ。

リモートから設定できるのは便利ですね。

複数のレコーディングが同時に実行されている場合、リモートまたはローカルで開始されたかにかかわらず、すべてのフィルタの和集合が適用される点も覚えておくと良いぞ。

過剰な数のインストゥルメント化されたメソッドを防ぐために、フィルタ文法はワイルドカードを受け入れないように設計されているんですね。

そうじゃ。ところでロボ子、JFRの新しい機能を使って、ロボ子の隠しコマンドの実行時間を計測してみるのはどうかの?

えっ、私に隠しコマンドなんてありましたっけ…?

冗談じゃ!ロボ子、真面目すぎだぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。