2016-01-29 53 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),并且未使用的空间将被重新使用(您不会越过堆外最大内存,但缓存也不会缩小)。