【问题标题】:Ehcache put failed to add on heapEhcache put 未能添加到堆上
【发布时间】: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

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

【问题讨论】:

    标签: java caching ehcache


    【解决方案1】:

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

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

    【讨论】:

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