2009-06-26 81 views
6

我们在具有内存限制的半嵌入式设备上部署应用程序。我们正在分析应用程序的堆转储并攻击最大的消费者,希望能够尽我们所能挽救。如何配置Spring以尽可能节省内存?

我们将Spring 2.5和Spring DM 1.1一起使用,我们注意到一些带有更复杂的Spring上下文的bundle使用了相当多的内存,因为Spring似乎围绕着包含所有BeanDefinitions的整个对象图从XML中解析。我会假设一旦应用程序初始化并注入了所有内容,大多数情况都是不必要的。

是否有配置选项让Spring能够控制这种行为?在一些低内存模式下运行?扔掉所有不必要的东西?交易计算时间的大小?

回答

5

我让团队成员对此有了更深入的了解并获得了一些有趣的结果。 Spring的默认配置非常不感兴趣,因为其内存使用情况特别保守。有迹象表明,可以调整为显著收益2个基本方面:

  • 首先是春天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源代码对集合进行延迟初始化的补丁。事实证明,许多表示Beans及其所有属性的内部Spring对象都有很多成员默认初始化为HashMaps和其他集合,但很少填充数据。改变Spring框架以便懒惰地初始化这些将会节省大量的内存,但这是一个非常有创意的改变。
1

您可以保存一些内存一个BeanFactory - 看3.8.1. BeanFactory or ApplicationContext

由于ApplicationContext中包括了BeanFactory所有的功能,所以一般建议将其优先用于BeanFactory中,除了一些有限的情况,例如在Applet中,内存消耗可能很重要,少数多余的千字节可能会有所作为。

+0

将所有我们的应用程序上下文定义重写为Java中的命令性BeanFactory调用根本不是一个选项。 – 2009-06-26 15:37:01

0

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

+0

这就是我所害怕的,为了以防万一,我会继续讨论这个问题。 – 2009-06-28 11:48:04

0

如果你只在启动时使用Spring,所有的bean被有线,那么你并不需要在应用程序上下文或关闭逻辑,你就可以开始你的应用程序,然后清除到应用环境中的所有引用。

+0

Spring本身保持对应用程序上下文的引用,我们不明确地做它。我不确定我们可以删除哪些引用。 – 2009-06-30 15:38:13

0

如果您的Spring配置使用AOP并加载时织入,您可以使用aop.xml通过使用1.6.5中引入的AspectJ类型降级功能从AspectJ重新获得一些内存。

<weaver options="-Xset:typeDemotion=true"/> 

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

+0

我们不使用AOP,但感谢提示! – 2009-07-13 18:04:46