Ehcache put 无法添加到堆上

Ehcache put failed to add on heap

给定以下缓存配置 (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

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

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

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