ehcache - ehcache 3.4 中的磁盘持久缓存正在使用(泄漏?)直接内存

标签 ehcache ehcache-3

我正在运行一个使用 Ehcache 3.4.0 的网络应用程序。我有一个缓存配置,它定义了 1000 个内存中对象的简单默认值:

<cache-template name="default">
    <key-type>java.lang.Object</key-type>
    <value-type>java.lang.Object</value-type>
    <heap unit="entries">1000</heap>
</cache-template>

然后我有一些使用此默认模板的基于磁盘的缓存,但会覆盖所有值(以编程方式生成,因此这就是它们甚至完全使用默认模板的原因),如下所示:

<cache alias='runViewCache' uses-template='default'>
    <key-type>java.lang.String</key-type>
    <value-type>java.lang.String</value-type>
    <resources>
        <heap unit='entries'>1</heap>
        <disk unit='GB' persistent='true'>1</disk>
    </resources>
</cache>

当数据写入我的基于磁盘的缓存时,JVM 使用直接/堆外内存,并且永远不会释放。即使清除缓存也不会释放内存。使用的内存与写入基于磁盘的缓存的数据直接相关(据我所知几乎是逐字节的)。

此缓存的权威层是 org.ehcache.impl.internal.store.disk.OffHeapDiskStore 的一个实例。

这似乎是内存泄漏(内存被消耗且从未释放),但我绝不是配置 ehcache 的专家。任何人都可以建议更改配置以导致我的磁盘层不使用堆外内存吗?或者,是否还有其他我完全误解了其他人可以指出的事情?

谢谢!

最佳答案

如何衡量“已使用”?

TL;DR 不,磁盘层不会浪费 RAM。

截至v3.0.0 Ehcache 使用内存映射文件进行磁盘持久化:

Replacement of the port of Ehcache 2.x open source disk store by one that leverages the offheap library and memory mapped files.

这意味着,Ehcache 使用内存地址空间来访问磁盘上的文件。这确实消耗了 0 字节的 RAM。 (至少是直接的。正如@louis-jacomet 所说,操作系统可以决定将部分文件缓存在 RAM 中。)

当您在 Linux 上运行时,您应该比较进程的 VIRT 和 RES 值。 VIRT 是进程使用的虚拟字节数。 RES 是进程使用的实际 RAM (RESident) 字节数。 VIRT 应该增加,同时填充磁盘存储缓存,但 RES 应该保持相当稳定。

关于ehcache - ehcache 3.4 中的磁盘持久缓存正在使用(泄漏?)直接内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47064988/

相关文章:

grails - 什么是Grails的Ehcache TTL?

java - 如何在 JUnit 测试中强制命中二级缓存?

基于 Java 的基于 Ehcache 的缓存配置不起作用

java - 如何在ehcache 3.5 版本中配置缓存过期为none 和overflowToDisk ="false"?

java - 使用Ehcache时出现ClosedChannelException异常

java - 如何让Ehcache保持无界缓存的堆大小字节统计?

Spring @Cacheable 不缓存

java - EhCache 3 : How to unwrap statistics bean?

xml-configuration - 在 ehcache 3.x 版本中用于指定磁盘路径的等效 xml 标记是什么