Spring classloader 在使用 context:load-time-weaver 时多次加载 class

Spring classloader loads class multiple times when context:load-time-weaver is used

请问为什么spring classloader在[=43中使用<context:load-time-weaver aspectj-weaving="on" />多次加载java classes =]配置?

我可以看到 spring 正在使用

org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader

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

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

我们正在使用 Spring 3.2.4 和 AspectJ 1.7.4

更新:

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

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