4

インターセプターを使用して、Bean のパブリック メソッド呼び出しの実行時間を測定します。それにもかかわらず、Bean のメソッドが他のプライベート メソッドを呼び出すと、監査インターセプターを無視するように見えます。

プライベート メソッドの実行時間もどのように測定できますか?

4

3 に答える 3

5

AOPの使用

AspectJのようなアスペクト指向プログラミングライブラリを使用して、ベンチマークを実装できます。

たとえば、次を参照してください。

プロファイラーの使用

  • 独自のエージェント拡張機能を実装できます(たとえば、JProfiler用)。
  • または、インターセプターをあきらめて、プロファイラーから検査するだけで、スナップショットをキャプチャして実行時間を記録することもできます。

JVMTIの使用

実際、これは一部のプロファイラーが行うことです。

JVMTI APIを使用して(正直に言うと、これがうまくいくかどうかは完全にはわかりません)、独自のコードインスペクターを実装し、JVMに直接接続することができます。


卑劣で邪悪なインライン化の問題

プライベートメソッドがコンパイル時または実行時にインライン化される可能性があるという彼の回答におけるjbの(有効な)懸念に関して、一部のJVMはそれを行わないか、この機能を無効にすることを許可する場合があります。

  • OracleのJRockitには、-XnoOpt最適化を無効にするオプションがあります(この特定のものを含む)。
  • Oracle / SunのHotSpotは、少なくとも以前は持っていました-XX:-Inline(まだ存在しているか、何かを実行しているかどうかはわかりません)。

ただし、これは、インライン化がアクティブ化されたときに本番環境で得られるものを正確に測定しないことを意味します。それでも、おそらくコードを検査するのに便利です。

于 2012-06-13T15:51:58.060 に答える
1

インターセプターは、インターフェイス メソッドの呼び出し時に EJB コンテナーによって適用されます。プライベート メソッドは、EJB コンテナーからは見えません。代わりにプロファイリング ツールを使用するのはどうですか?

于 2012-06-13T15:50:41.713 に答える
1

私の知る限り、プライベート メソッドは JVM レジャーで (コンパイル時でも) インライン化できるため、バイトコードに存在しない可能性があるため、プロファイリングできません。

メソッドにマークを付けることができると思いますprotected---そうすれば、本番環境でもインライン化されず、プロファイリングできます。

テスト インスタンスのプロファイルを作成する場合は、visualvm を試すことができます --- visualvm は非常に優れた代替手段です。VisualVM は、必要なすべての計測を行う JVM インスタンスをプロファイリングするためのグラフィカル ツールです。http://visualvm.java.net/。さらに、ほとんどの jdk ディストリビューションの標準ツールです。

于 2012-06-13T15:54:09.910 に答える