Я использую Ignite engine в качестве компонента в веб-приложении Spring загрузки. Конфигурация кэша выглядит следующим образом:Ignite не освобождает память после уничтожения кеша
<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 не освобождает ранее уничтоженный кеш.
EDIT
Я загрузил пробный проект Maven вместе с моим выходом на http://sourceforge.net/projects/ignitetest35087485/files/. Как вы увидите, он исчерпал мою память после 5 циклов разрушения нагрузки. Выселение для замены места не происходило, и воспламенение не учитывало установку offHeapMaxMemory.
В чем проблема? Буду признателен за любую оказанную помощь.
Как вы уничтожаете кеш? –
@Valentin Я пробовал эти методы: ignite.cache (cache) .clear(), ignite.cache (cache) .destroy(), ignite.destroyCache (cache). Это происходит внутри ComputeTask (выполняется async), где экземпляр ignite - это autwired IgniteInstanceResource. –
Вы в конечном итоге исчерпали память? Обратите внимание: возможно, что Java не освободит память сразу, это произойдет только во время процесса сбора мусора. Если ваше приложение не выходит из строя с ошибкой памяти и вы не испытываете очень длительных пауз GC, то, скорее всего, утечки нет. –