如何配置Spring以尽可能多地保存内存?

Bor*_*zic 6 java memory heap spring applicationcontext

我们在具有内存限制的半嵌入式设备上部署应用程序.我们正在分析应用程序的堆转储并攻击最大的消费者.

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

是否有Spring的配置选项允许控制此行为?在某种低内存模式下运行?扔掉所有不必要的东西?交易计算时间的大小?

Bor*_*zic 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

设置"setCacheBeanMetadata"属性false导致BeanDefinitions(你的基于XML的配置基本方案镜)来初始化后丢弃.

  • 第二个变化 - 我们目前有一个原型 - 是Spring源代码的补丁,用于对集合进行延迟初始化.事实证明,许多代表Beans及其所有属性的内部Spring对象都有很多成员,默认情况下初始化为HashMaps和其他集合,但很少填充数据.更改Spring框架以便懒惰地初始化这些将节省另外大量的内存,但这是一个更具侵略性的变化.