Как я могу настроить Spring для сохранения как можно большей памяти?

Хорошо, получил минус, причина не описала мой пример, так что больше примеров:):

Я использую регулярное выражение и метод тестирования:

var isInteger = /^[0-9]\d*$/;

isInteger.test(123); //true
isInteger.test('123'); // true
isInteger.test('sdf'); //false
isInteger.test('123sdf'); //false

// If u want to avoid string value:
typeof testVal !== 'string' && isInteger.test(testValue);
6
задан Brian Tompsett - 汤莱恩 31 May 2015 в 20:09
поделиться

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, представляющие Beans и все их свойства, имеют множество членов, которые по умолчанию инициализируются HashMaps и другими коллекциями, но очень редко заполняются данными. Изменение структуры Spring для их ленивой инициализации сэкономит еще один значительный объем памяти, но это гораздо более агрессивное изменение.
5
ответ дан 17 December 2019 в 02:32
поделиться

Вы можете сэкономить некоторую память с помощью BeanFactory - см. 3.8.1. BeanFactory или ApplicationContext :

Поскольку ApplicationContext включает в себя все функции BeanFactory, обычно рекомендуется использовать его вместо BeanFactory, за исключением нескольких ограниченных ситуаций, таких как в апплете, где потребление памяти может быть критичным, и несколько дополнительных килобайт могут иметь значение.

1
ответ дан 17 December 2019 в 02:32
поделиться

Я не знаю, как заставить Spring работать в "легком" режиме. Вы можете попробовать реализовать BeanFactoryPostProcessor и использовать его для удаления определенных bean-компонентов из контекста. Однако я не знаю, приведет ли это к внутренним ошибкам Spring.

0
ответ дан 17 December 2019 в 02:32
поделиться

Если вы используете Spring только при запуске, т.е. все bean-компоненты подключены, и тогда вам не нужен контекст приложения или логика выключения, вы можете начать ваше приложение, а затем удалите все ссылки на контекст приложения.

0
ответ дан 17 December 2019 в 02:32
поделиться

If your Spring configuration uses AOP and load time weaving, you could use aop.xml to regain some memory from AspectJ by using AspectJ type demotion feature that was introduced in 1.6.5.

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

Analyse your heap, if you find many RefType objects, the trick above will help.

0
ответ дан 17 December 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: