2016-01-29 2 views
0

Я использую 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 Гб enter image description here

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

Что еще хуже, я уничтожаю кеш, но использование памяти по-прежнему существует! enter image description here

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

EDIT

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

В чем проблема? Буду признателен за любую оказанную помощь.

+0

Как вы уничтожаете кеш? –

+0

@Valentin Я пробовал эти методы: ignite.cache (cache) .clear(), ignite.cache (cache) .destroy(), ignite.destroyCache (cache). Это происходит внутри ComputeTask (выполняется async), где экземпляр ignite - это autwired IgniteInstanceResource. –

+0

Вы в конечном итоге исчерпали память? Обратите внимание: возможно, что Java не освободит память сразу, это произойдет только во время процесса сбора мусора. Если ваше приложение не выходит из строя с ошибкой памяти и вы не испытываете очень длительных пауз GC, то, скорее всего, утечки нет. –

ответ

0

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