Ignite не освобождает память после уничтожения кеша

Я использую движок Ignite в качестве компонента внутри загрузочного веб-приложения Spring. Конфигурация кэша следующая:

<bean id="ignite" class="org.apache.ignite.IgniteSpringBean">
<property name="configuration">
    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="atomicityMode" value="TRANSACTIONAL" />
                    <property name="cacheMode" value="PARTITIONED" />
                    <property name="backups" value="0" />
                    <property name="startSize" value="#{1024*16}" />
                    <property name="memoryMode" value="OFFHEAP_TIERED" /> 
                    <property name="offHeapMaxMemory" value="#{1 * 1024L * 1024L * 1024L}" />
                    <property name="swapEnabled" value="true" />
                    <property name="evictSynchronized" value="true" />
                </bean>
            </list>
        </property>


        <property name="swapSpaceSpi">
            <bean class="org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi">
                <property name="baseDirectory" value="..." />
            </bean>
        </property>

Вот использование памяти по умолчанию после запуска движка с кучей 0,5 ГБ: введите здесь описание изображения

На данный момент я ожидаю, что максимальное использование памяти составит 2,6 ГБ, поскольку я установил максимальную память вне кучи на 1 ГБ. Но вот что происходит после того, как я загружу в кеш несколько миллионов объектов! введите здесь описание изображения

Что еще хуже, я уничтожаю кеш, но использование памяти все еще там! введите здесь описание изображения

В этот момент, если я попытаюсь загрузить больше записей в кеш, использование памяти просто продолжит расти, доказывая, что ignite не освободил кеш, который я уничтожил ранее.

ИЗМЕНИТЬ

Я загрузил тестовый проект maven вместе с выводом на http://sourceforge.net/projects/ignitetest35087485/files/. Как вы увидите, он истощил мою память после 5 циклов загрузки-уничтожения. Выселение в пространство подкачки не произошло, а ignite не учитывал настройку offHeapMaxMemory.

В чем проблема? Любая помощь очень ценится.


person Akın Özer    schedule 29.01.2016    source источник
comment
Как уничтожить кеш?   -  person Valentin Kulichenko    schedule 30.01.2016
comment
@Valentin Я пробовал эти методы: ignite.cache(cache).clear(), ignite.cache(cache).destroy(), ignite.destroyCache(cache). Это происходит внутри ComputeTask (выполняется асинхронно), где экземпляр ignite является автоматически подключаемым IgniteInstanceResource.   -  person Akın Özer    schedule 01.02.2016
comment
У вас в конечном итоге заканчивается память? Обратите внимание, что возможно, что Java не освободит память сразу, это произойдет только во время процесса сборки мусора. Если ваше приложение не завершается сбоем из-за ошибки нехватки памяти и вы не сталкиваетесь с очень длительными паузами GC, то, скорее всего, утечки нет.   -  person Valentin Kulichenko    schedule 02.02.2016
comment
P.S. Я только что создал тест, который создает и уничтожает кэши с данными в цикле. У меня это работает нормально, память в конечном итоге освобождается сборщиком мусора.   -  person Valentin Kulichenko    schedule 02.02.2016
comment
Привет Валентин, не могли бы вы упомянуть, как вы очистили / удалили кеш?   -  person Rajashekhar Meesala    schedule 15.09.2020


Ответы (1)


Единственный способ, который сработал для меня, — это вызвать Cache#removeAll + Ignite#destroyCache + Ignite#createCache. Благодаря этому я смог создать новый кеш с новой/обновленной конфигурацией и разблокировать устаревшую память вне кучи перед созданием нового кеша. Это позволяет уменьшать и увеличивать объем памяти по мере необходимости. Если вы знаете, что у вас есть абсолютный макс. и не надо его сжимать, можно просто настроить off-heap-max-memory (+EvictionPolicy и ExpiryPolicy) и неиспользуемое пространство будет переиспользовано (вы не переборете off-heap-max-memory, но кеш также не сжимается).

person Dar Whi    schedule 05.03.2016