【发布时间】:2016-05-07 08:43:01
【问题描述】:
我在 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>
现在我预计最大内存使用量为 2.6 GB,因为我将堆外最大内存设置为 1 GB。但这是我将数百万个对象加载到缓存中后发生的情况!
此时如果我尝试将更多条目加载到缓存中,内存使用量只会不断增长,证明 ignite 并没有释放我之前销毁的缓存。
编辑
我将一个 Maven 测试项目连同我的输出上传到 http://sourceforge.net/projects/ignitetest35087485/files/。正如您将看到的,它在 5 次负载销毁循环后耗尽了我的记忆。没有进行交换空间的驱逐,并且 ignite 没有考虑 offHeapMaxMemory 设置。
这里有什么问题?非常感谢任何帮助。
【问题讨论】:
-
如何销毁缓存?
-
@Valentin 我尝试了这些方法:ignite.cache(cache).clear()、ignite.cache(cache).destroy()、ignite.destroyCache(cache)。这发生在 ComputeTask(执行异步)中,其中 ignite 实例是自动装配的 IgniteInstanceResource。
-
您是否最终会耗尽内存?请注意,Java 可能不会立即释放内存,它只会在垃圾收集过程中发生。如果您的应用程序没有因内存不足错误而失败,并且您没有经历很长时间的 GC 暂停,那么很可能没有泄漏。
-
P.S.我刚刚创建了一个测试,该测试使用循环中的数据创建和销毁缓存。它对我来说很好,内存最终被 GC 释放。
-
嗨 Valentin,能否请您提一下,您是如何清除/删除缓存的?
标签: java spring caching memory-management ignite