为什么 Ehcache 2.8.8 在使用 -Dnet.sf.ehcache.use.classic.lru=true 时忽略我的 maxBytesLocalHeap 参数

Why Ehcache 2.8.8 ignore my maxBytesLocalHeap parameter when using -Dnet.sf.ehcache.use.classic.lru=true

我在我的 webapp 中使用了 Ehcache 2.8.8 的 LRU 策略, 当没有 -Dnet.sf.ehcache.use.classic.lru=true 时 Ehcache 尊重我的 maxBytesLocalHeap 参数; 但是当系统设置 属性 时它不会这样做。

在Class缓存中:

if (useClassicLru  && onfiguration.getMemoryStoreEvictionPolicy().
equals(MemoryStoreEvictionPolicy.LRU)) {
    Store disk = createDiskStore();
    store = new LegacyStoreWrapper(new LruMemoryStore(this, disk),  
            disk, registeredEventListeners, configuration);
} else {
    if (configuration.isOverflowToDisk()) {
         store = DiskStore.createCacheStore(this, onHeapPool, 
                 onDiskPool);
    } else {
         store = MemoryStore.create(this, onHeapPool);
    }
}

并且在 Class LruMemoryStore 中:

public LruMemoryStore(Ehcache cache, Store diskStore) {
    status = Status.STATUS_UNINITIALISED;
    this.maximumSize = 
        cache.getCacheConfiguration().getMaxEntriesLocalHeap();
    this.cachePinned =  
        determineCachePinned(cache.getCacheConfiguration());
    this.elementPinningEnabled = 
        !cache.getCacheConfiguration().isOverflowToOffHeap();
    this.cache = cache;
    this.diskStore = diskStore;
    if (cache.getCacheConfiguration().isOverflowToDisk()) {
        evictionObserver = null;
    } else {
        evictionObserver = 
           StatisticBuilder.operation(EvictionOutcome.class).
           named("eviction").of(this).build();
    }
    map = new SpoolingLinkedHashMap();
    status = Status.STATUS_ALIVE;
    copyStrategyHandler = MemoryStore.getCopyStrategyHandler(cache);
}

所以我猜只有 MaxEntriesLocalHeap 有效?

是否可以设置为jvm系统属性?

当您显式请求 经典 LRU 时,您实际上得到了旧版本的内部代码,该代码被保留是因为一些用户依赖于它的行为。

这意味着您实际上无法使用此后引入的功能,包括以字节为单位调整堆层大小。

所以你是对的,只有 maxEntriesLocalHeap 允许你调整堆层的大小。这不能通过系统设置 属性.