【问题标题】:Ignite doesn't free memory after cache destroy缓存销毁后,Ignite 不会释放内存
【发布时间】: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>

这是我用 0.5GB 堆启动引擎后的默认内存使用情况:

现在我预计最大内存使用量为 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多