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

时间:2016-08-01 20:17:36

标签: caching ehcache lru

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

在类缓存中:

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);
    }
}

在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系统属性?

1 个答案:

答案 0 :(得分:0)

当您明确请求经典LRU 时,您实际上会获得一个旧版本的内部代码,因为某些用户依赖于其行为而保留该代码。

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

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