【问题标题】:Spring classloader loads class multiple times when context:load-time-weaver is usedSpring 类加载器在使用 context:load-time-weaver 时多次加载类
【发布时间】:2015-09-18 16:36:39
【问题描述】:

想问一下xml config中使用<context:load-time-weaver aspectj-weaving="on" />,为什么spring classloader会多次加载java类?

我可以看到 spring 正在使用

org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader

类加载器,正如我在文档中所读到的,它为每个加载的类创建新的类加载器实例。在我们当前的项目中,这导致了 11 个相同类型的加载类 - 1 个使用父类加载器,另外 10 个使用 ContextOverridingClassLoader(每个都加载了自己的)。这可能是什么原因?如果我们并行启动许多应用程序,这些重复的类会占用过多的永久内存(导致崩溃)。当然,我们可以只增加 permgen 内存,但我很好奇是否还有其他事情可做。

一旦我删除了这个配置参数,spring 只加载所有类一次。我使用 -XX:+TraceClassLoading VM 选项和堆转储检查了这一点。

我们正在使用 Spring 3.2.4 和 AspectJ 1.7.4

更新:

升级到 Spring 4.2.1 后,每个类现在加载 15 次。它会以某种方式与弹簧方面有关吗?

【问题讨论】:

    标签: spring aspectj


    【解决方案1】:

    我们最终在应用程序上下文初始化后调用 GC,从而减少了许多应用程序并行启动期间使用的内存量(与更长的应用程序启动时间的良好折衷),因为每个应用程序在初始化后都会清理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多