如何配置Spring以尽可能地节省内存?

7
我们正在半嵌入式设备上部署一个应用程序,该设备具有内存限制。为了节省尽可能多的空间,我们分析了应用程序的堆转储,并攻击了最大的消费者。
我们使用Spring 2.5和Spring DM 1.1,我们注意到一些具有更复杂Spring上下文的包会使用相当多的内存,因为Spring似乎会保留所有从XML解析出的BeanDefinitions的对象图。我认为,一旦应用程序已初始化并注入了所有内容,大部分都是不必要的。
是否有Spring的配置选项可以控制这种行为?运行在低内存模式下?丢弃所有不必要的东西?牺牲计算时间来换取大小?
5个回答

5

我请团队成员对此进行了深入研究,得出了一些有趣的结果。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源代码的一个补丁,可以对集合进行延迟初始化。事实证明,许多内部Spring对象,它们表示Bean及其所有属性,具有许多成员默认情况下初始化为HashMap和其他集合,但很少填充数据。将Spring框架更改为惰性地初始化这些内容将节省另外大量的内存,但这是一项更加深入的更改。

1

使用BeanFactory可以节省一些内存 - 参见3.8.1.BeanFactory或ApplicationContext

由于ApplicationContext包含了BeanFactory的所有功能,因此通常建议优先使用ApplicationContext,除非在一些有限的情况下,例如在Applet中,内存消耗可能很关键,而几个额外的千字节可能会有所不同。


用Java编写所有应用上下文定义的命令式BeanFactory调用根本不是一种选择。 - Boris Terzic

0
如果你的Spring配置使用了AOP和加载时织入,你可以使用aop.xml通过使用AspectJ类型降级功能,在一定程度上从AspectJ中回收内存。该功能是在1.6.5版本中引入的。
<weaver options="-Xset:typeDemotion=true"/>

分析您的堆,如果发现许多RefType对象,则上述技巧将会有所帮助。

0

我不知道有什么方法可以让Spring以“轻量级”模式运行。您可以尝试实现一个BeanFactoryPostProcessor,并使用它从上下文中删除某些bean。但是,我不知道这是否会导致Spring内部错误。


这就是我担心的,我会保持问题开放几天以防万一。 - Boris Terzic

0
如果您只在启动时使用Spring,即所有bean都已连接,然后您不需要应用程序上下文或关闭逻辑,则可以启动应用程序,然后清除对应用程序上下文的所有引用。

Spring本身会保留对应用程序上下文的引用,我们不需要显式地进行处理。我不确定我们可以删除哪些引用。 - Boris Terzic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接