代码之家  ›  专栏  ›  技术社区  ›  Janning Vygen

弹簧启动性能@可配置编译时编织

  •  2
  • Janning Vygen  · 技术社区  · 15 年前

    这是我第一个关于堆栈溢出的问题,所以请友好一点。

    我正在运行一个应用程序

    • 春季2.5
    • 可配置的注释
    • 编译时编织(CTW)
    • 马文
    • Eclipse/AJDT

    我用CTW,一切正常。但是,如果我第一次实例化一个带注释的类,则需要很长时间。第二次非常快。

    在第一次调用的探查器堆栈跟踪中,我看到93%的时间被 org.aspectj.weaver.internal.tools.pointcutExpressionImpl.matchesMethodExecution(方法)

    在第二次调用的堆栈跟踪中,此方法只使用了1%的时间。更糟糕的是:第一次通话的时间大约是第二次通话的10倍。

    我在想,我以为CTW不再需要一个织布工了。

    但是,似乎只有当有人调用这个类的新特性时,Spring才会开始分析原型bean。它使用AspectjWeaver来分析需要做什么,并为下一个调用加速这个过程做好准备。

    有没有人有加快初始化注释类的第一个调用的经验?

    这是我的一个小把戏:

     <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>
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Rich Seller    15 年前

    通过Spring的AOP配置,您可以获得抽象性和便利性的度量,另一方面,Spring需要在类加载期间做大量的工作来生成动态代理和编织类。这在启动时总是有开销。

    然而,服务器启动时间很少是一个关键因素,您往往会在几天内测量正常运行时间,因此,在我看来,为了所有的方便,一分钟左右的缓慢启动是一个公平的交易,尽管出于调试目的,这可能会很烦人。

    如果您向服务器启动添加一些进程来运行应用程序,可以稍微减少首次加载的开销。这有助于确保服务器已准备就绪,因此您的第一个实际请求不会受到影响。

    如果必须更快地启动,或者发现开销不可接受,那么可以考虑使用编译时编织来实现切入点。使用这种方法,重载提升都是在编译时完成的,因此类将在与未出炉版本相当的时间内加载(当然取决于编织操作)。

        2
  •  0
  •   Janning Vygen    15 年前

    在分析堆栈跟踪时,我自己找到了答案。

    除了@configurable with ctw之外,我还使用它进行事务管理。当第一次加载用@configurable注释的原型bean时,Springbean工厂会检查我们的aop:advice是否匹配。因此,它使用AspectJ库。

    所以我最初的问题是有误导性的。我们将ctw用于@configurable,但同时将ltw用于事务和安全管理。编译时编织的bean必须在加载时再次编织。

    我现在将寻找一种完全避免LTW的方法,因为在我们的开发过程中,启动时间至关重要。

    感谢您的评论和回答。他们把我推向正确的方向,帮助了我。

    推荐文章