我使用Ignite引擎作为Spring启动Web应用程序中的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>
现在,由于我将堆外最大内存设置为1 GB,因此我预计最大内存使用量为2.6 GB。但这是我将一百万个对象加载到缓存后会发生什么!
此时如果我尝试将更多条目加载到缓存中,内存使用率会不断增长,证明点燃并没有释放我之前销毁的缓存。
修改
我将maven测试项目和我的输出上传到http://sourceforge.net/projects/ignitetest35087485/files/。正如您将看到的,在5次load-destroy循环后,它耗尽了我的记忆。没有进行交换空间的驱逐,点燃也没有考虑offHeapMaxMemory设置。
这是什么问题?非常感谢任何帮助。
答案 0 :(得分:0)
对我有用的唯一方法是调用Cache #removeAll + Ignite#destroyCache + Ignite #createCache。有了这个,我就能够创建一个带有新/更新配置的新缓存,并在创建新缓存之前解锁过时的堆外内存。这样可以根据需要缩小和增加内存量。如果你知道你有绝对最大值。并且不需要缩小它,你可以只配置off-heap-max-memory(+ EvictionPolicy和ExpiryPolicy),并且将重用未使用的空间(你不会克服off-heap-max-memory,但是缓存也不会缩小。)