2016-01-29 51 views
0

我在Ignite引擎中將Spring引導Web應用程序用作bean。高速緩存配置如下: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.5GB堆發動機: enter image description here

現在,在這一點上,我期待的最大內存使用量是2.6 GB,因爲我將堆外最大內存設置爲1 GB。但是,在將數百萬個對象加載到緩存後,會發生什麼? enter image description here

更糟糕的是,我摧毀了緩存,但內存使用仍然存在! enter image description here

在這一點上,如果我嘗試加載更多的條目到緩存中,內存使用量不斷增長,證明點燃沒有釋放我之前銷燬的緩存。

編輯

我上傳我的輸出http://sourceforge.net/projects/ignitetest35087485/files/沿着一個maven測試項目。正如你將會看到的那樣,它會在5輪負載破壞後耗盡我的記憶。遷移空間的驅逐沒有發生,點燃並未考慮offHeapMaxMemory設置。

這裏有什麼問題?任何幫助深表感謝。

+0

如何銷燬緩存? –

+0

@Valentin我試過這些方法:ignite.cache(緩存).clear(),ignite.cache(緩存).destroy(),ignite.destroyCache(緩存)。這發生在ComputeTask(執行異步)內,其中ignite實例是一個自動裝配的IgniteInstanceResource。 –

+0

你最終是否內存不足?請注意,Java可能不會立即釋放內存,它只會在垃圾回收過程中發生。如果您的應用程序不會因內存不足錯誤而失敗,並且不會遇到非常長的GC暫停,那麼很可能不會出現泄漏。 –

回答

0

我工作的唯一方法是調用Cache#removeAll + Ignite#destroyCache + Ignite#createCache。因此,我可以在創建新緩存之前創建一個新的/更新配置的緩存並解鎖過時的堆外存儲器。這可以根據需要縮小和增加內存量。如果你知道你有一個絕對最大值。並且不需要縮小它,您可以配置堆外最大內存(+ EvictionPolicy和ExpiryPolicy),並且未使用的空間將被重新使用(您不會越過堆外最大內存,但緩存也不會縮小)。