我正在运行一个使用Ehcache 3.4.0的web应用程序。我有一个缓存配置,它定义一个简单的缺省值为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的专家。有人能建议进行配置更改,从而导致磁盘层不使用堆外内存吗?或者,我只是完全误解了其他人可以指出的其他东西吗?
谢谢!
发布于 2017-11-14 13:15:14
你如何衡量“使用”?
不,磁盘层不会浪费RAM。
从v3.0.0开始,Ehcache使用内存映射文件进行磁盘持久化:
将Ehcache 2.x开放源码磁盘存储端口替换为利用OF堆库和内存映射文件的端口。
这意味着Ehcache使用内存中的地址空间访问磁盘上的文件.这确实消耗了0字节的RAM。(至少是直接的。正如@已经指出的,操作系统可以决定在RAM中缓存部分文件。)
在Linux上运行时,您应该比较进程的VIRT和RES值。VIRT是进程使用的虚拟字节的数量。RES是进程使用的实际内存(RESident)字节的数量。当填充磁盘存储缓存时,VIRT应该会增加,但是RES应该保持相当稳定。
https://stackoverflow.com/questions/47064988
复制相似问题