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

标签 java spring memory heap-memory applicationcontext

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

我们将 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/

相关文章:

java - tomcat 8.5 上的 Apache cxf 回车问题

Java Spring 事务管理

java - RestController 的抽象类自定义反序列化

java - Android 应用程序如何使用 >=256Mb 的 RAM?

java - Android Tabhost刷新

Java 读取和保存 GUI 元素

java - 我想在 ListView 中一行显示两个项目

java - MongoDB - Java 驱动性能

python - Cython:将 C 缓冲区内存 View 返回给 Python

内存分配时的 C++ 错误