当前位置: 首页 > 知识库问答 >
问题:

为什么使用aspectjweaver javaagent进行加载时编织对我来说如此缓慢?

方浩旷
2023-03-14

我正在做的项目相当大。在尝试为这个spring项目进行加载时编织时,我被指示同时使用spring工具javaagent和aspectjweaver javaagent。然而,我注意到,当使用aspectjweaver代理时,我的启动时间增加了4-6倍。我还可以看到来自ContextOverridingClassLoader的相同编织消息4-6次。

然而,如果我删除aspectjweaver,并且只使用spring工具,我注意到我的启动时间大大减少,每个连接点只有一条来自AppClassLoader的weave消息。

唯一的问题是一些特定的类没有被编织(我发现这是因为在类加载器加载错误的类之前,spring应用程序上下文还没有被加载,因为spring是实现编织的机制)。我通过创建一个自定义javaagent找到了自己的解决方案,它以与spring instrument相同的方式支持编织,只是它在premain中而不是在应用程序上下文加载中这样做。它现在在合理的时间内编织所有的课程。

然而,我不想走这条破烂的路,因为我只能假设这两个代理被设计成这样是有原因的。

我想知道是否还有人在aspectjweaver javaagent中看到过类似的问题,以及是否有人可能知道为什么该代理与仅使用Spring仪器相比如此缓慢。

共有1个答案

莘欣怿
2023-03-14

如果有人对这个答案感兴趣,我已经解决了这个问题。

Spring使用临时类加载器ContextOverridingClassLoader来获取bean类的元数据,然后再将它们实际加载到上下文中。

Spring工具javaagent(或更准确地说,可能使用或不使用Spring工具javaagent的Spring框架代码)专门只编织由用于加载应用程序上下文的类加载器加载的类。

InstrumentationLoadTimeWeaver$FilteringClassFileTransger内部的代码:

        if (!this.targetClassLoader.equals(loader)) {
            return null;
        }
        return this.targetTransformer.transform(
                loader, className, classBeingRedefined, protectionDomain, classfileBuffer);

另一方面,aspectjweaver没有这样的过滤机制,因此即使是由spring的临时ContextOverridingClassLoader加载的类也会进行编织。幸运的是,aspectjweaver有一个基本上没有文档记录的系统属性(或者至少我找不到关于这个的任何文档),名为aj。编织。装载机滑行。通过将此设置为:

-Daj.weaving.loadersToSkip=org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader

我能够跳过类加载器的编织,极大地加快了应用程序上下文的加载速度。

顺便提一下,我发现spring工具和aspectjweaver最终都使用ClassPreProcessorAgentAdapter来编织类,因此可能没有必要同时使用这两个代理(aspectjweaver将编织spring工具将要编织的类的超集)。但是,根据您的配置,应用程序可能会在启动时抱怨缺少代理,因此您也可以将其包括在内(代价是增加一些不必要的额外开销)。

 类似资料:
  • 我一直在尝试获得一个示例@Configuration构建工作(在groovy中),所以我可以使用Spring容器触发依赖注入,但我得到的只是关于-javaagent的错误,我似乎无法修复 我有一个这样的beanConfig类 然后,我将调用一个示例类new,并尝试获取spring容器中的注入,在上面的配置类中声明diSource bean “@Configurable(自动装配=自动装配。BY_T

  • (这个问题与此密切相关,但它是一个更具体的问题,我希望能就此得到答案)

  • 问题内容: 我有一些针对angularjs应用运行的简单的业力/茉莉单元测试。我使用最新版本的Chrome,并在WebStorm IDE中运行测试。 有时测试套件运行非常快(0.24秒) 有时,针对完全相同的代码的完全相同的测试套件运行非常缓慢(120秒) 我尝试了所有常识性修复。我在网上搜寻了一下,以发现我在做什么错。 为什么我的测试运行如此缓慢? 问题答案: 答案很简单。 我正在使用Chrom

  • 我构建了一个应用程序来测试围绕类注入日志信息(进入和退出)。我使用Spring构建了它,并使用以下示例构建它。 http://static.springsource.org/spring/docs/2.5.5/reference/aop.html#aop-aj ltw公司 它现在工作得很好,但我有2个问题: 当日志围绕方法编织时,不包括私有方法。在Spring的xml设置中是否有允许编织私有方法的

  • 但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是: