2

das ist meine erste Frage auf Stack-Überlauf, also bitte sei nett.Startleistung von Spring @Configurable mit Kompilierzeit Weben

Ich arbeite mit einer App mit

  • Feder 2.5.x
  • Konfigurierbare Anmerkungen
  • Compile Zeit Weberei (CTW)
  • Maven
  • eclipse/AJDT

Ich benutze CTW und alles läuft gut. Aber wenn ich eine annotierte Klasse zum ersten Mal instanziiere, dauert es sehr lange. Beim zweiten Mal ist es sehr schnell.

am Profiler Stapelüberwachung der Suche nach dem ersten Aufruf i 93% der Zeit gesehen von org.aspectj.weaver.internal.tools.PointcutExpressionImpl.matchesMethodExecution verwendet wird (Methode)

In dem Stapel von trace der zweite Aufruf wird nur 1% der Zeit in dieser Methode verwendet. Noch schlimmer: Der erste Anruf dauert etwa 10 mal so lange wie der zweite Anruf.

Ich fragte mich, wie ich dachte, dass ein Weber mit CTW nicht mehr benötigt wird.

Aber es scheint, dass Spring beginnt, die Prototyp-Bean nur zu analysieren, sobald jemand in dieser Klasse neu anruft. Es verwendet aspectj weaver, um zu analysieren, was zu tun ist, und bereitet sich darauf vor, diesen Prozess für den nächsten Aufruf zu beschleunigen.

Hat jemand Erfahrung mit der Beschleunigung des ersten Aufrufs der Initialisierung einer annotierten Klasse?

dies ein Ausschnitt aus meiner pom ist:

<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

Ich denke, das ist in CTW inhärent. Der erste Aufruf muss das ganze Heben, um Laufzeitklassen zu analysieren, zu weben und zu generieren, und es ist ziemlich teuer. – skaffman

+0

Es sollte in Load-Time-Weaving (LTW) inhärent sein, aber nicht in CTW! – Janning

Antwort

0

Ich fand die Antwort von mir, als ich die Stack-Spur analysierte.

Neben @Configurable mit CTW verwende ich für das Transaktionsmanagement. Wenn meine Prototyp-Bean, die mit @Configurable versehen ist, zum ersten Mal geladen wird, überprüft Spring Bean Factory, ob einer unserer aop: advices passt.Daher verwendet es eine aspectj-Bibliothek.

Also meine ursprüngliche Frage war irgendwie irreführend. Wir verwenden CTW für @Configurable, verwenden LTW aber gleichzeitig für das Transaktions- und Sicherheitsmanagement. Die zur Kompilierungszeit gewebte Bean muss dann zur Ladezeit erneut gewebt werden.

Ich werde jetzt nach einer Möglichkeit suchen, LTW zu vermeiden, da die Startzeit in unserem Entwicklungsprozess entscheidend ist.

Vielen Dank für Ihre Kommentare und Antworten. Sie waren hilfreich, als sie mich in die richtige Richtung schoben.

2

Mit Ihnen Spring AOP Konfiguration ein gewisses Maß an Abstraktion und Bequemlichkeit gewinnen, die Kehrseite ist, dass Frühling eine Menge Arbeit während des Unterrichts Laden tun muss, erzeugen die dynamischen Proxies und weben die Klassen. Dies hat immer einen Overhead beim Start.

Die Server-Startzeit ist jedoch selten ein kritischer Faktor, Sie neigen dazu, die Betriebszeit in Tagen zu messen, so eine Minute oder so langsam Startup ist ein fairer Handel für alle Bequemlichkeit meiner Meinung nach, obwohl es für Debugging-Zwecke ärgerlich sein könnte.

Sie können den Overhead beim erstmaligen Laden etwas abschwächen, wenn Sie dem Serverstart einige Prozesse hinzufügen, um die Anwendung auszuführen. Dies hilft sicherzustellen, dass der Server vorbereitet ist, so dass Ihre erste echte Anfrage den Treffer nicht übernimmt.

Wenn Sie schneller starten müssen oder den Overhead nicht akzeptabel finden, können Sie die Pointcuts mit dem Weben für die Kompilierzeit implementieren. Bei diesem Ansatz wird das schwere Heben zur Kompilierzeit durchgeführt, so dass die Klassen in einer vergleichbaren Zeit wie die nicht gewebten Versionen geladen werden (abhängig davon, was das Weben natürlich tut).

Verwandte Themen