gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:18:53 29 4
gpt4 key购买 nike

我正在运行一个使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com