我们正在有内存限制的半嵌入式设备上部署应用程序。为了尽可能节省一切,我们正在分析应用程序的堆转储并攻击最大的消费者。

我们将 Spring 2.5 与 Spring DM 1.1 一起使用,我们注意到一些具有更复杂 Spring 上下文的包占用了大量内存,因为 Spring 似乎保留了包含从 XML 解析的所有 BeanDefinition 的整个对象图。我认为一旦应用程序初始化并且所有内容都被注入,其中大部分都是不必要的。

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基础结构)被废弃之后的初始化。

  • 第二次改变-那我们目前有一个原型是一个补丁春的源代码做懒惰的初始化的集合。事实证明,许多内部的春天对象,表示豆和他们所有的性质有了很多的成员初始化为散和其他集合的默认,但很少填充数据。改变的春框架初始化这些懒洋洋地将节省大量的存储器,但它是一个更侵入性的变化。

其他提示

您可以保存 一些 BeanFactory 的内存 - 请参阅 3.8.1.BeanFactory 或 ApplicationContext:

由于 ApplicationContext 包含 BeanFactory 的所有功能,因此通常建议优先使用它而不是 BeanFactory,除了少数有限的情况,例如在 Applet 中,其中内存消耗可能很关键,并且额外的几千字节可能会导致不同之处。

我不知道的任何方式使“轻”模式Spring运行。你可以尝试实现BeanFactoryPostProcessor的,并用它来从上下文中删除某些豆类。我不知道这是否是会导致然而内部弹簧的错误。

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

如果你的Spring配置使用AOP和加载时间编织,可以使用通过aop.xml中使用在1.6.5介绍AspectJ的类型降级功能恢复从AspectJ的一些记忆。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top