Ehcache put 未能添加到堆上

Posted

技术标签:

【中文标题】Ehcache put 未能添加到堆上【英文标题】:Ehcache put failed to add on heap 【发布时间】:2016-01-19 15:02:15 【问题描述】:

鉴于以下缓存配置(ehcache-core 2.6.0)

<ehcache>
    <cache name="myTestCache"
        maxBytesLocalHeap="10M"
        maxBytesLocalDisk="100M"
        eternal="true"            
        memoryStoreEvictionPolicy="LRU"
        statistics="true">
        <persistence 
            strategy="localTempSwap"
        />
        <sizeOfPolicy
            maxDepth="1000000"
        />
    </cache>
</ehcache>

我试图把物体放在大约。 4MB 大小(由 ehcache 本身测量)缓存,但它被拒绝(不缓存,不抛出异常),put failed to add on heap 消息记录在 DEBUG 级别。

所以我将maxBytesLocalHeap 增加到50M,现在我的对象已成功缓存并记录了put added 34355928 on heap 消息。

所以我想知道,为什么 ehcache sizeOf 引擎说对象大小为 4MB 但未能将其放入 10MB 缓存中,是所需大小的两倍多?我还从缓存中得到了calculateInMemorySize,表明它的大小(我认为这个是序列化的)实际上大约是 4MB。

同样当这个对象被放入内存时,ehcache 日志

fault removed -34355696 from heap
fault added 5973558 on disk

考虑到这是缓存中的第一个对象,为什么它只存储 0,7 MB 到磁盘?我读过分层内存模型,但这就像它只将部分对象从堆存储到磁盘。

在这个操作之后,现在统计数据显示

calculateInMemorySize = 35135952
calculateOnDiskSize = 5973558

这个操作正确吗?这种行为有什么解释吗?

【问题讨论】:

【参考方案1】:

您共享的所有数字似乎都表明该对象的内存约为 35MB。您从哪里得知它的大小为 4MB?

至于堆和磁盘之间的大小差异,请记住写入磁盘的是序列化形式。根据您的对象结构,这确实会使大小变化很大。

【讨论】:

所以,对于第一部分...我是有史以来最大的白痴。就像我现在不能责备自己一样。我最近一直在用 C++ 做一些工作,并且习惯于计算位而不是字节。所以我的大脑是有线/ 8 / 1024 / 1024。让这个警告每个人都仔细检查你最深信的“错误”。对于第二部分,我将尝试在明天手动对其进行序列化,看看差异有多大。谢谢你的指正,现在我要去撞墙一段时间了。

以上是关于Ehcache put 未能添加到堆上的主要内容,如果未能解决你的问题,请参考以下文章

ehcache3-源码简析三

Ehcache学习ehcache与spring注解实例

ehcache 缓存

Mybatis学习整合第三方缓存EHCache

Ehcache学习总结二: Ehcache+Spring+Mybaits整合

Spring缓存机制----EhCache缓存实现的配置