0

我在 Spring Boot Web 应用程序中使用 Ignite 引擎作为 bean。缓存配置如下:

<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 堆启动引擎后的默认内存使用情况: 在此处输入图像描述

现在,我预计最大内存使用量为 2.6 GB,因为我将堆外最大内存设置为 1 GB。但这是我将数百万个对象加载到缓存中后发生的情况! 在此处输入图像描述

更糟糕的是,我破坏了缓存,但内存使用量还在! 在此处输入图像描述

此时,如果我尝试将更多条目加载到缓存中,内存使用量只会不断增长,这证明 ignite 并没有释放我之前销毁的缓存。

编辑

我将一个 Maven 测试项目连同我的输出一起上传到http://sourceforge.net/projects/ignitetest35087485/files/。正如您将看到的,它在 5 次负载销毁循环后耗尽了我的记忆。没有进行交换空间的驱逐,并且 ignite 没有考虑 offHeapMaxMemory 设置。

这里有什么问题?任何帮助深表感谢。

4

1 回答 1

0

对我有用的唯一方法是调用 Cache#removeAll + Ignite#destroyCache + Ignite#createCache。有了它,我就能够使用新的/更新的配置创建一个新的缓存,并在创建新的缓存之前解锁过时的堆外内存。这允许根据需要缩小和增加内存量。如果你知道你有一个绝对最大值。并且不需要缩小它,您只需配置 off-heap-max-memory(+ EvictionPolicy 和 ExpiryPolicy),未使用的空间将被重新使用(您不会超过 off-heap-max-memory,但是缓存也不会缩小)。

于 2016-03-05T23:03:51.807 回答