当使用context:load-time-weaver时,Spring类加载器会多次加载类

时间:2015-09-18 16:36:40

标签: spring aspectj

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

我可以看到春天正在使用

org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader

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

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

我们正在使用Spring 3.2.4和AspectJ 1.7.4

更新

升级到Spring 4.2.1后,每个类现在加载15次。它能以某种方式与春天方面联系起来吗?

1 个答案:

答案 0 :(得分:0)

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