我们要在具有内存限制的半嵌入式设备上部署应用程序。为了尽我们所能,我们正在分析应用程序的堆转储并攻击最大的消费者。
我们将 Spring 2.5 与 Spring DM 1.1 一起使用,我们注意到我们的一些具有更复杂 Spring 上下文的包正在占用相当多的内存,因为 Spring 似乎保留了包含所有已解析的 BeanDefinition 的整个对象图从 XML。我认为一旦应用程序初始化并注入(inject)所有内容,其中大部分都是不必要的。
是否有 Spring 的配置选项可以控制这种行为?在一些低内存模式下运行?扔掉所有不需要的东西?用计算时间换大小?
最佳答案
我让团队成员对此进行了更深入的研究,并得到了一些有趣的结果。默认配置中的 Spring 对内存使用特别保守不感兴趣。可以调整两个基本方面以获得显着 yield :
- 第一个是 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 的配置的编程镜像)在初始化后被丢弃。
- 第二个变化——我们目前有一个原型(prototype)——是 Spring 源代码的一个补丁,用于对集合进行惰性初始化。事实证明,许多表示 Beans 及其所有属性的内部 Spring 对象都有很多默认情况下初始化为 HashMaps 和其他集合的成员,但很少填充数据。更改 Spring 框架以延迟初始化这些将节省大量内存,但这是一个更具侵入性的更改。
关于java - 如何配置 Spring 以尽可能多地节省内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049692/