我让团队成员对此进行了更深入的研究,并得到了一些有趣的结果。Spring 在其默认配置中对在内存使用方面特别保守并不感兴趣。有两个基本方面可以调整以获得显着收益:
- 第一个是 Spring 内部的非公开属性
OsgiBundleXmlApplicationContext
,如果您从该类扩展并覆盖该customizeBeanFactory
方法,则可以覆盖该属性。
我们是这样做的:
@Override
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
super.customizeBeanFactory(beanFactory);
String cacheBeanMetadataSysProp = System.getProperty(CACHE_BEAN_METADATA, "true");
if (cacheBeanMetadataSysProp != null
&& cacheBeanMetadataSysProp.equalsIgnoreCase("false")) {
beanFactory.setCacheBeanMetadata(false);
} else if (cacheBeanMetadataSysProp != null
&& cacheBeanMetadataSysProp.equalsIgnoreCase("true")) {
beanFactory.setCacheBeanMetadata(true);
}
}
将“setCacheBeanMetadata”属性设置为false
会导致BeanDefinitions
(基本上是基于 XML 的配置的编程镜像)在初始化后被丢弃。
- 第二个变化——我们目前有一个原型——是 Spring 源代码的补丁,用于对集合进行延迟初始化。事实证明,许多代表 Bean 的内部 Spring 对象及其所有属性都有很多成员,默认情况下初始化为 HashMap 和其他集合,但很少填充数据。更改 Spring 框架以延迟初始化这些将节省大量内存,但这是一个更具侵入性的更改。