我想问一下,为什么在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次。它能以某种方式与春天方面联系起来吗?
答案 0 :(得分:0)
我们最终在应用程序上下文初始化后调用GC,因此在初始化后每个应用程序清理时,减少了许多应用程序并行启动期间使用的内存量(与较长的应用程序启动的良好权衡)。