2

これはスタック オーバーフローに関する私の最初の質問なので、親切にお願いします。

私はアプリを実行しています

  • 春 2.5.x
  • 設定可能な注釈
  • コンパイル時ウィービング (CTW)
  • メイヴン
  • Eclipse/ajdt

私はCTWを使用していますが、すべて正常に動作します。しかし、注釈付きクラスを初めてインスタンス化すると、非常に時間がかかります。2 回目は非常に高速です。

最初の呼び出しのプロファイラー スタック トレースを見ると、時間の 93% が org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesMethodExecution(Method) によって使用されていることがわかりました

2 番目の呼び出しのスタック トレースでは、このメソッドで使用される時間はわずか 1% です。さらに悪いことに、最初の呼び出しは 2 番目の呼び出しの約 10 倍の時間がかかります。

CTWではウィーバーはもう必要ないと思っていたので、疑問に思っていました。

しかし、Spring は、誰かがこのクラスで new を呼び出すとすぐに、プロトタイプ化された Bean の分析を開始するようです。これは、aspectj ウィーバーを使用して何を行う必要があるかを分析し、次の呼び出しのためにこのプロセスを高速化する準備をします。

注釈付きクラスを初期化する最初の呼び出しを高速化した経験のある人はいますか?

これは私のpomのスニペットです:

 <plugin>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>aspectj-maven-plugin</artifactId>
 <executions>
    <execution>
      <goals>
        <goal>test-compile</goal>
        <goal>compile</goal>
      </goals>
</execution>
 </executions>
 <dependencies>
   <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjtools</artifactId>
     <version>1.6.1</version>
   </dependency>
 </dependencies>
 <configuration>
 <verbose>true</verbose>
 <complianceLevel>1.5</complianceLevel>
 <source>1.5</source>
 <showWeaveInfo>true</showWeaveInfo>
 <outxml>true</outxml>
 <aspectLibraries>
   <aspectLibrary>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aspects</artifactId>
   </aspectLibrary>
 </aspectLibraries>
 </configuration>
 </plugin>
4

2 に答える 2

2

Spring の aop 構成を使用すると、ある程度の抽象化と利便性が得られますが、その反面、Spring はクラスのロード中に動的プロキシを生成してクラスを織り込むために多くの作業を行う必要があります。これには、起動時に常にオーバーヘッドがあります。

ただし、サーバーの起動時間が重要な要素になることはめったにありません。アップタイムを日単位で測定する傾向があるため、私の意見では、デバッグ目的では煩わしいかもしれませんが、起動が 1 分ほど遅いのは公平なトレードです。

アプリケーションを実行するためにサーバーの起動にいくつかのプロセスを追加すると、初回の読み込みのオーバーヘッドをいくらか軽減できます。これにより、サーバーが確実に準備されるため、最初の実際のリクエストがヒットすることはありません。

より迅速に起動する必要がある場合、またはオーバーヘッドが許容できない場合は、コンパイル時のウィービングでポイントカットを実装することを検討してください。このアプローチでは、重労働はすべてコンパイル時に行われるため、クラスは織り込まれていないバージョンと同等の時間でロードされます (もちろん織り方によって異なります)。

于 2009-07-16T18:44:20.563 に答える
0

スタックトレースを分析したところ、自分で答えを見つけました。

@Configurable with CTW に加えて、トランザクション管理に使用しています。@Configurable でアノテーションが付けられたプロトタイプ Bean が初めてロードされると、Spring Bean ファクトリは aop:advices のいずれかが一致するかどうかを確認します。そのため、aspectj ライブラリを使用します。

したがって、私の最初の質問はどういうわけか誤解を招くものでした。@Configurable には CTW を使用していますが、トランザクションとセキュリティ管理には同時に LTW を使用しています。コンパイル時にウィービングされた Bean は、ロード時に再度ウィービングする必要があります。

開発プロセスでは起動時間が重要であるため、LTW をまったく回避する方法を探します。

コメントと回答ありがとうございます。彼らは私を正しい方向に押してくれたので役に立ちました.

于 2009-07-20T09:26:46.407 に答える