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 未能添加到堆上的主要内容,如果未能解决你的问题,请参考以下文章