【发布时间】: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 次。它会以某种方式与弹簧方面有关吗?
【问题讨论】: