为什么 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
允许你调整堆层的大小。这不能通过系统设置 属性.
我在我的 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
允许你调整堆层的大小。这不能通过系统设置 属性.