2

これはスタックオーバーフローに関する私の最初の質問ですので、親切にしてください。コンパイルタイムウィービングでSpring @Configurableの起動パフォーマンス

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

  • スプリング2.5.xの
  • 設定可能な注釈
  • コンパイル時織り(CTW)
  • のmaven
  • 日食/ AJDT

私はCTWを使用し、すべて正常に動作します。しかし、初めて注釈付きクラスをインスタンス化すると、非常に時間がかかります。 2回目は非常に速いです。私は時間の93%が、スタックトレースで org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesMethodExecution(方法)

で使用されて見た最初の呼び出しのためのプロファイラスタックトレースを見ると

2回目の呼び出しはこのメソッドでは1%の時間しか使用されません。さらに悪いことに、最初のコールには2回目のコールの約10倍の時間がかかります。

私はウィーバーがもはやCTWに必要ではないと思っていたのですが、私は思っていました。

しかし、SpringがプロトタイプBeanの解析を開始するのは、誰かがこのクラスで新しいものを呼び出すとすぐに始まるようです。これはaspectjウィーバーを使って何が行われるべきかを分析し、次の呼び出しのためにこのプロセスをスピードアップする準備をします。

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

これは私のポンポンの抜粋です:SpringのAOPの構成で

<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> 
+0

私はこれがCTWに内在していると思います。最初の呼び出しは、分析、織り、ランタイムクラスを生成するためにすべての重労働をしなければならず、非常に高価です。 – skaffman

+0

LTW(Load-time-weaving)に固有のはずですが、CTWでは不可能です。 – Janning

答えて

0

私はスタックトレースを分析したときに自分の答えを見つけました。

@Configurableに加えて、私はトランザクション管理に使用しています。 @Configurableでアノテートされた私のプロトタイプBeanが初めて読み込まれると、Spring Beanの工場はaop:advicesのいずれかが一致するかどうかをチェックします。したがって、aspectjライブラリを使用します。

私の元々の質問はどういうわけか誤解を招いていました。 @ConfigurableにはCTWを使用していますが、LTWをトランザクションとセキュリティ管理に同時に使用しています。コンパイル時にウィービングされたBeanは、読み込み時に再度ウィービングされなければなりません。

私たちは開発プロセスで起動時間が重要なので、今LTWを避ける方法を探します。

ご意見ありがとうございます。彼らは私を正しい方向に押しやってくれたので助けになりました。

2

あなたは抽象化と利便性の尺度を獲得、フリップ側では春が生成するクラスローディング中に多くの作業を行う必要があるということです動的なプロキシとクラスを織りなさい。これは起動時に常にオーバーヘッドが発生します。

しかし、サーバーの起動時間は重要な要素ではありません。稼働時間を日単位で測定する傾向があります。デバッグのために迷惑をかける可能性がありますが、

サーバーの起動時にアプリケーションを実行するプロセスを追加すると、初回の読み込み時のオーバーヘッドを軽減できます。これにより、サーバーのプライミングが確実に行われるため、最初の実際のリクエストでヒットしません。

起動時間を短縮したり、オーバーヘッドが許容できないと判断しなければならない場合は、コンパイル時の織りでポイントカットを実装することを検討してください。このアプローチでは、コンパイル時に重い吊り上げがすべて行われるので、クラスは織られていないバージョンと同等の時間にロードされます(もちろん、織り方に応じて)。

関連する問題